将仅包含单引号值的 CSV 字符串拆分为两元素数组

问题描述 投票:0回答:5

我有一个看起来像这样的字符串:

'word','another word','and a sentence','and more','etc etc'

我需要将其拆分为两个字符串,并用第二个逗号分隔——这不应显示在任何一个句子中。让事情变得复杂的是,字符串的各个引号部分内也可以有逗号。

php csv split
5个回答
1
投票

这看起来非常像 CSV 语法,所以:

$parsed  = str_getcsv($string, ',', "'");
$string1 = join(',', array_slice($parsed, 0, 2));
$string2 = join(',', array_slice($parsed, 2));

如果您的 PHP 版本低于 5.3,因此您没有

str_getcsv
,您可以使用虚拟文件句柄将其复制到
php://temp
fgetcsv

或者,根据语法的难度,

strtok
可以用于简单的解析器。找到第一个
'
,然后是下一个
'
,然后是
,
,然后是
'
,然后是下一个
'
,你就得到了字符串的第一部分...


0
投票
$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'
)

0
投票

既然你说引号之间可以有逗号..所以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);     


             ?>

0
投票

引号之间有逗号

$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;

'一个词','另一个词'

‘还有一句话’、‘还有更多’、‘等等’


0
投票

对于那些对正则表达式没有偏见的人,

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'
)
© www.soinside.com 2019 - 2024. All rights reserved.