我有一个看起来像这样的字符串:
'word','another word','and a sentence','and more','etc etc'
我需要将其拆分为两个字符串,并用第二个逗号分隔——这不应显示在任何一个句子中。让事情变得复杂的是,字符串的各个引号部分内也可以有逗号。
这看起来非常像 CSV 语法,所以:
$parsed = str_getcsv($string, ',', "'");
$string1 = join(',', array_slice($parsed, 0, 2));
$string2 = join(',', array_slice($parsed, 2));
str_getcsv
,您可以使用虚拟文件句柄将其复制到 php://temp
和 fgetcsv
。
strtok
可以用于简单的解析器。找到第一个 '
,然后是下一个 '
,然后是 ,
,然后是 '
,然后是下一个 '
,你就得到了字符串的第一部分...
$a="'word','another word','and a sentence','and more','etc etc'";
//preg_match('{(.*?,[^,]*),(.*)}', $a, $matches);
preg_match('{(.*?[^\\\\]\',.*?[^\\\\]\'),(.*)}', $a, $matches); //UPDATE
print_r($matches);
显示:
Array
(
[0] => 'word','another word','and a sentence','and more','etc etc'
[1] => 'word','another word'
[2] => 'and a sentence','and more','etc etc'
)
既然你说引号之间可以有逗号..所以preg_split可以比爆炸更好地帮助你
<?php
$string = "'word','another word','and a sentence','and more','etc etc'";
$pattern = '%\',\'%';
$split = preg_split($pattern,$string);
$array1 = array();
$array2 = array();
foreach($split as $key=>$value)
{
$value = trim($value,"'");
$value = "'{$value}'";
if(($key === 0) || ($key ===1))
{
$array1[] = $value;
}
else
{
$array2[] = $value;
}
}
echo $req_string1 = implode(',',$array1);
echo "<br>";
echo $req_string2 = implode(',',$array2);
?>
引号之间有逗号
$a="'word','another word','and a sentence','and more','etc etc'";
eval("\$arr = array($a);");
$text1='';
$text2='';
foreach($arr AS $k=>$v){
if($k<2){
$text1.=$text1?',':'';
$text1.="'{$v}'";
}else{
$text2.=$text2?',':'';
$text2.="'{$v}'";
}
}
echo $text1;
echo PHP_EOL;
echo $text2;
'一个词','另一个词'
‘还有一句话’、‘还有更多’、‘等等’
对于那些对正则表达式没有偏见的人,
preg_split()
可以通过一次简洁的调用达到预期的结果。
匹配两个重复的单引号子字符串,后跟逗号。
\K
用于重新开始全字符串匹配 - 因此消耗了两半之间不需要的逗号。
代码:(演示)
$csv = "'word','another word','and a sentence','and more','etc etc'";
print_r(
preg_split("/^(?:'[^']*'\K,){2}/", $csv)
);
输出:
Array
(
[0] => 'word','another word'
[1] => 'and a sentence','and more','etc etc'
)