我使用 preg_split 方法有问题。我想用逗号分隔,但前提是逗号不在(和)之间。
例如:
id,user(id,firstname),image(id)
应该返回:
0 => id
1 => user(id,firstname)
2 => image(id)
快速且易读的解决方案可能是这样的:
<?php
function parse($str) {
$str = preg_replace('~(\(.*?),(.*?\))~', '$1_#_PLACEHOLDER_#_$2', $str);
$items = array();
foreach (explode(',', $str) as $item) {
$items[] = str_replace('_#_PLACEHOLDER_#_', ',', $item);
};
return $items;
}
var_dump(parse('id,user(id,firstname),image(id)'));
绝对可以用一个正则表达式来完成,但可读性会受到严重损害。
您可能想尝试使用解析器生成器而不是正则表达式。我不熟悉 PHP 中的替代方案,但这个答案表明有几个替代方案。
我建议尝试找到一个解析器,但可以使用正则表达式来完成。
使用以下正则表达式:/\G(?> *)(?|([^,]*\((?>\\.|[^()])+\)[^,]*)|(?![()])([^,]+?)) *(?:,|$)/g
更多细节在这里:http ://regex101.com/r/nA7dW5
祝你好运
我已经使用preg_split
with解决了这个问题PREG_SPLIT_DELIM_CAPTURE
。
$tokens = preg_split('#(\,|\(|\))#', 'id,user(id,firstname),image(id)', PREG_SPLIT_DELIM_CAPTURE);
回报:
["id", ",", "user", "(", "id", "firstname", ")", "image", "(", "id", ")"]
之后,您可以使用简单的 switch case 解析该数组。
正则表达式/(\([^()]+\))|([^,]+)/
将匹配所有内容,括号外的逗号除外。它有帮助吗?