PHP拆分逗号分隔值但保留引号

时间:2017-01-03 17:45:08

标签: php regex string csv split

我正在尝试拆分包含以逗号分隔的值集的字符串。这可以通过使用str_getcsv来实现,但我还有一个额外的要求。我需要保留报价。

输入字符串为:

string(30) "Hello, "San Diego, California""

我尝试了两种方法:

爆炸

$result = explode(",", $string);

结果是

array(3) {
  [0]=>
  string(5) "Hello"
  [1]=>
  string(11) " "San Diego"
  [2]=>
  string(12) " California""
}

str_getcsv

$result = str_getcsv($string, ",");

这个导致

array(2) {
  [0]=>
  string(5) "Hello"
  [1]=>
  string(21) "San Diego, California"
}

我更喜欢使用str_getcsv,因为它会正确地拆分值,但会修剪封闭的引号。我需要那些引号,所以我希望我可以在不自动删除引号的情况下调用该函数。

其他信息

我实际上对正则表达式解决方案持开放态度,但我在该领域一无所知。

我尝试了solution here但它没有用。

2 个答案:

答案 0 :(得分:1)

这突破了我的正则表达式知识的极限,我无法想出一个优雅的正则表达式,它涵盖输入字符串的所有可能情况(例如,如果字符串以逗号结尾),而不会在结尾处留下空匹配。

$parts = preg_split('/(?:"[^"]*"|)\K\s*(,\s*|$)/', $string);

这本身就是:

Array
(
    [0] => Hello
    [1] => "San Diego, California"
    [2] => 
)

因此,如果您不想要这些,则需要清理最后匹配的1-2个空元素(取决于输入字符串):

$i = count($parts);
while ($i) {
    if ($parts[--$i] == '') {
        unset($parts[$i]);
    } else {
        break;
    }
}

注意:正则表达式从每个匹配的开始/结束修剪空白。如果您不想要,请删除\s*部分。

答案 1 :(得分:0)

$wrapped = array_map(function($value) { 
   return "\"$value\"";
}, str_getcsv($string, ","));

更新:你可以尝试这样的事情:

$value = preg_split('~(?:\'[^\']*\'|"[^"]*"|)\K(,|$)~', $string);

我从PHP get comma separated values which are not enclosed

取消了这个