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)'));
単一の正規表現で確実に実行できますが、読みやすさが大幅に損なわれます。
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 ケースでその配列を解析できます。
代わりにパーサーを探すことをお勧めしますが、正規表現を使用して行うことができます。
次の正規表現を使用します。/\G(?> *)(?|([^,]*\((?>\\.|[^()])+\)[^,]*)|(?![()])([^,]+?)) *(?:,|$)/g
詳細はこちら: http://regex101.com/r/nA7dW5
幸運を
正規表現ではなく、パーサー ジェネレーターを試してみることをお勧めします。私はPHPの代替手段に精通していませんが、この回答はいくつかの代替手段を示しています。
正規表現/(\([^()]+\))|([^,]+)/
は、括弧の外側のコンマを除いて、すべてに一致します。それは役に立ちますか?