【问题标题】:PHP split comma-separated values but retain quotesPHP拆分逗号分隔值但保留引号
【发布时间】:2017-01-03 17:45:07
【问题描述】:

我正在尝试拆分包含逗号分隔值集的字符串。这可以简单地通过使用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,但它不起作用。

【问题讨论】:

标签: php regex string csv split


【解决方案1】:

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

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

这本身就是:

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

你可以像这样清理空元素:

$result = array_filter($parts, function ($value) {
    return ($value !== '');
});

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

【讨论】:

  • 我目前正在使用我在 SO:~(?:\'[^\']*\'|"[^"]*"|)\K(,|$)~ 中找到的类似模式,但我真的不知道它的作用,但它以某种方式起作用。我发现的和你的模式有什么区别?我也对空元素很好,因为我正在做array_filter,所以之后它们会被删除。
  • @uom-pgregorio 基本上是一样的,除了你的一个检查单引号和双引号,我的一个只做双引号,但也会修剪空白,给你像str_getcsv() 一样的结果。
【解决方案2】:
$wrapped = array_map(function($value) { 
   return "\"$value\"";
}, str_getcsv($string, ","));

更新:你可以试试这样的:

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

我从 PHP get comma separated values which are not enclosed 提出这个问题

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
相关资源
最近更新 更多