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()
的结果。