Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP分割逗号分隔的值,但保留引号_Php_Regex_String_Csv_Split - Fatal编程技术网

PHP分割逗号分隔的值,但保留引号

PHP分割逗号分隔的值,但保留引号,php,regex,string,csv,split,Php,Regex,String,Csv,Split,我正在尝试拆分一个包含逗号分隔的值集的字符串。这可以通过使用str_getcsv简单地实现,但是我有一个额外的要求,它不能满足。我需要保留报价 输入字符串为: string(30) "Hello, "San Diego, California"" 我尝试了两种方法: 爆炸 导致 array(3) { [0]=> string(5) "Hello" [1]=> string(11) " "San Diego" [2]=> string(12) " Cal

我正在尝试拆分一个包含逗号分隔的值集的字符串。这可以通过使用
str_getcsv
简单地实现,但是我有一个额外的要求,它不能满足。我需要保留报价

输入字符串为:

string(30) "Hello, "San Diego, California""
我尝试了两种方法:

爆炸 导致

array(3) {
  [0]=>
  string(5) "Hello"
  [1]=>
  string(11) " "San Diego"
  [2]=>
  string(12) " California""
}
array(2) {
  [0]=>
  string(5) "Hello"
  [1]=>
  string(21) "San Diego, California"
}
str_getcsv 这一个导致

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

我更喜欢使用
str_getcsv
,因为它可以正确地分割值,但会修剪掉包含的引号。我需要这些引号,所以我希望我可以调用函数,而不会自动删除引号

附加信息 我实际上对正则表达式的解决方案持开放态度,但在这方面我一无所知


我试过了,但没用

$wrapped = array_map(function($value) { 
   return "\"$value\"";
}, str_getcsv($string, ","));
更新:您可以尝试以下方法:

$value = preg_split('~(?:\'[^\']*\'|"[^"]*"|)\K(,|$)~', $string);
$result = array_filter($parts, function ($value) {
    return ($value !== '');
});

我把它从

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

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

Array
(
    [0] => Hello
    [1] => "San Diego, California"
    [2] => 
)
您可以像这样清理空元素:

$value = preg_split('~(?:\'[^\']*\'|"[^"]*"|)\K(,|$)~', $string);
$result = array_filter($parts, function ($value) {
    return ($value !== '');
});

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

这将用引号将所有元素括起来。我只想在元素中加引号。这个答案可能会有帮助。我目前使用的模式与SO中的模式类似:
~(?:\'[^\']*\'.[^']*\'.[^']*.*)\K(,|$)~
但我不知道它到底是干什么的,但不知怎么的,它确实起作用了。我发现的和你的模式有什么区别?我在做
array\u filter
时对空元素也没问题,所以它们会在以后被删除。@uom pgregorio基本上是一样的,只是你的一个检查单引号和双引号,而我的一个只检查单引号和双引号删除双引号,但也修剪空白,以提供类似于
str\u getcsv()
的结果。