如何在字符串中的每个第二个逗号空间爆炸?

时间:2015-11-24 15:38:58

标签: php delimiter explode

我在一些旧代码中发现了一个错误,希望我可以在SO社区的帮助下快速修复。

用户可以将多个城市/州插入数组中,因此数组看起来像这样:

 Norfolk, VA, Chicago, IL, New York, NY

我需要保留内部逗号并使用尾随逗号作为分隔符。

当前的PHP代码获取如下数据:

 $deliveryCityArray = explode(',', $_POST['deliveryCity']);

当在网格中显示时,城市/州应该在同一列中。

不幸的是,根据我目前的代码,City将位于自己的单元格中,State将位于下一行。

我需要添加什么来保留尾随逗号但保留内部逗号?

4 个答案:

答案 0 :(得分:2)

像往常一样爆炸,然后将结果数组分成对,然后走对,再次内爆它们

$deliveryCity = 'Norfolk, VA, Chicago, IL, New York, NY';

$deliveryCityArray = array_map(
    function($value) {
        return implode(',', $value);
    },
    array_chunk(
        explode(',', $deliveryCity),
        2
    )
);

Demo

答案 1 :(得分:2)

你能做到这一点的唯一方法是做一些假设 - 只要你确信'分离'逗号总是每隔一个,你就可以这样做:

$results = array();
$tmp = explode(",",$_POST['deliveryCity']);
$idx = 0;
while ($idx < count($tmp)){
   $results[] = $tmp[$idx] . "," . $tmp[$idx+1];
   $idx += 2;
}

//$results will contain your resultant array.

答案 2 :(得分:2)

您尝试处理的字符串中有模式:您希望在2个大写字母后{@ 1}}每个逗号上的输入。在那种情况下:

explode

工作正常(DEMO

工作原理:

  • $array = preg_split('/(?<=, [A-Z]{2}),/', $str); :正面的背后断言。如果模式前面有某个子模式,则该模式将匹配
  • (?<=:子模式:逗号,空格和2个大写字母(结束括号表示后视断言结束)
  • , [A-Z]{2}):一个小型,(如果后卫成功,则匹配)。此字符匹配并用于爆炸字符串。 lookbehind是零宽度匹配,所以它不被视为分隔符的一部分

如果整个字符串都是大写的,那么模式需要偶然一点,但不是很多(Updated demo):

,

我只是在lookbehind(与字边界匹配的元字符)中添加了$array = preg_split('/(?<=,\s[A-Z]{2}\b),/', $upperStr); 。无论如何,这个单词边界是可选的,因为我们无论如何都会匹配\b

答案 3 :(得分:0)

使用正则表达式时,为了获得最佳效率,请避免使用捕获组和外观。通过利用\K“重新启动全字符串匹配”,可以在没有这些技术的情况下完成此任务。

代码:(Demo

$string='Norfolk, VA, Chicago, IL, New York, NY';
var_export(preg_split('/[A-Z]{2}\K, /',$string));

输出:

array (
  0 => 'Norfolk, VA',
  1 => 'Chicago, IL',
  2 => 'New York, NY',
)

这种模式有效地说:

  • 查找缩写状态(两个uppcase字母)然后
  • 重新启动全字符串匹配,然后
  • 使用逗号和空格作为分隔符。简单干净。