PHPの正規表現フレーバーは再帰パターンをサポートしているため、次のように機能します。
$text = "first,second[,b],third[a,b[1,2,3]],fourth[a[1,2]],sixth";
preg_match_all('/[^,\[\]]+(\[([^\[\]]|(?1))*])?/', $text, $matches);
print_r($matches[0]);
印刷されます:
配列
((
[0]=>最初
[1] =>秒[、b]
[2] => third [a、b [1,2,3]]
[3]=>4番目[a[1,2]]
[4]=>6番目
)。
ここで重要なのはsplit
、ではなく、match
です。
このような不可解な正規表現をコードベースに追加するかどうかは、あなた次第です:)
編集
上記の提案は、で始まるエントリと一致しないことに気づきました[
。これを行うには、次のようにします。
$text = "first,second[,b],third[a,b[1,2,3]],fourth[a[1,2]],sixth,[s,[,e,[,v,],e,],n]";
preg_match_all("/
( # start match group 1
[^,\[\]] # any char other than a comma or square bracket
| # OR
\[ # an opening square bracket
( # start match group 2
[^\[\]] # any char other than a square bracket
| # OR
(?R) # recursively match the entire pattern
)* # end match group 2, and repeat it zero or more times
] # an closing square bracket
)+ # end match group 1, and repeat it once or more times
/x",
$text,
$matches
);
print_r($matches[0]);
印刷するもの:
配列
((
[0]=>最初
[1] =>秒[、b]
[2] => third [a、b [1,2,3]]
[3]=>4番目[a[1,2]]
[4]=>6番目
[5] => [s、[、e、[、v、]、e、]、n]
)。