我在一些旧代码中发现了一个错误,希望我可以在SO社区的帮助下快速修复。
用户可以将多个城市/州插入数组中,因此数组看起来像这样:
Norfolk, VA, Chicago, IL, New York, NY
我需要保留内部逗号并使用尾随逗号作为分隔符。
当前的PHP代码获取如下数据:
$deliveryCityArray = explode(',', $_POST['deliveryCity']);
当在网格中显示时,城市/州应该在同一列中。
不幸的是,根据我目前的代码,City将位于自己的单元格中,State将位于下一行。
我需要添加什么来保留尾随逗号但保留内部逗号?
答案 0 :(得分:2)
像往常一样爆炸,然后将结果数组分成对,然后走对,再次内爆它们
$deliveryCity = 'Norfolk, VA, Chicago, IL, New York, NY';
$deliveryCityArray = array_map(
function($value) {
return implode(',', $value);
},
array_chunk(
explode(',', $deliveryCity),
2
)
);
答案 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',
)
这种模式有效地说: