我正在尝试拆分包含以逗号分隔的值集的字符串。这可以通过使用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""
}
$result = str_getcsv($string, ",");
这个导致
array(2) {
[0]=>
string(5) "Hello"
[1]=>
string(21) "San Diego, California"
}
我更喜欢使用str_getcsv
,因为它会正确地拆分值,但会修剪封闭的引号。我需要那些引号,所以我希望我可以在不自动删除引号的情况下调用该函数。
我实际上对正则表达式解决方案持开放态度,但我在该领域一无所知。
我尝试了solution here但它没有用。
答案 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);
取消了这个