2

我使用 preg_split 方法有问题。我想用逗号分隔,但前提是逗号不在()之间。

例如:

id,user(id,firstname),image(id)

应该返回:

0 => id
1 => user(id,firstname)
2 => image(id)
4

5 回答 5

2

快速且易读的解决方案可能是这样的:

<?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)'));

绝对可以用一个正则表达式来完成,但可读性会受到严重损害。

于 2012-09-24T21:53:26.730 回答
0

您可能想尝试使用解析器生成器而不是正则表达式。我不熟悉 PHP 中的替代方案,但这个答案表明有几个替代方案。

于 2012-09-24T21:50:45.387 回答
0

我建议尝试找到一个解析器,但可以使用正则表达式来完成。

使用以下正则表达式:/\G(?> *)(?|([^,]*\((?>\\.|[^()])+\)[^,]*)|(?![()])([^,]+?)) *(?:,|$)/g

更多细节在这里:http ://regex101.com/r/nA7dW5

祝你好运

于 2012-09-24T21:53:03.013 回答
0

我已经使用preg_splitwith解决了这个问题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 解析该数组。

于 2013-06-25T09:42:48.263 回答
-1

正则表达式/(\([^()]+\))|([^,]+)/将匹配所有内容,括号外的逗号除外。它有帮助吗?

于 2012-09-24T21:53:12.917 回答