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

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 ケースでその配列を解析できます。

于 2013-06-25T09:42:48.263 に答える
0

代わりにパーサーを探すことをお勧めしますが、正規表現を使用して行うことができます。

次の正規表現を使用します。/\G(?> *)(?|([^,]*\((?>\\.|[^()])+\)[^,]*)|(?![()])([^,]+?)) *(?:,|$)/g

詳細はこちら: http://regex101.com/r/nA7dW5

幸運を

于 2012-09-24T21:53:03.013 に答える
0

正規表現ではなく、パーサー ジェネレーターを試してみることをお勧めします。私はPHPの代替手段に精通していませんが、この回答はいくつかの代替手段を示しています。

于 2012-09-24T21:50:45.387 に答える
-1

正規表現/(\([^()]+\))|([^,]+)/は、括弧の外側のコンマを除いて、すべてに一致します。それは役に立ちますか?

于 2012-09-24T21:53:12.917 に答える