$buf = "..."; $pattern = "/" . "{"; $bracketsNum = 8; for ($i = 0; $i < $bracketsNum; $i++) { $pattern .= "" . "(?:(?:" . "(?:[^\{\}]*)" . "|" . "(?:(?:" . "{"; } $pattern .= "" . "(?:[^\{\}]*)"; for ($i = 0; $i < $bracketsNum; $i++) { $pattern .= "" . "}" . ")*)" . ")*)"; } $pattern .= "" . "}" . "/"; if (preg_match_all($pattern, $buf, $matches)) { var_export($matches); }大外の{...}ごとに分割します。
"...", '...', /.../ などに {} があると失敗します。
その場合、そういったパターンを用意します。
$p1 = "(?:[^\{\}]*)"; $p2_1 = "[^\{\}\"\\\\]"; $p2_2 = "(?:\"(?:(?:[^\"\\\\]|(?:\\\\.))*)\")"; $p2 = "(?:(?:{$p2_1}|{$p2_2})*)"; $p3_1 = "[^\{\}\'\"\\\\]"; $p3_2 = "(?:\'(?:(?:[^\'\\\\]|(?:\\\\.))*)\')"; $p3 = "(?:(?:{$p3_1}|{$p3_2}|{$p2_2})*)"; $p4_1 = "[^\{\}\\/\'\"\\\\]"; $p4_2 = "(?:\\/(?:(?:[^\\/\\\\]|(?:\\\\.))*)\\/)"; $p4 = "(?:(?:{$p4_1}|{$p4_2}|{$p3_2}|{$p2_2})*)";一部をコメント付きにした場合の例
$p2 = " # 内部オプションにxを指定した場合に使えます。 # (?x:pattern) は無理です。 # / ... (?:pattern) ... /x とする場合。 (?: # 括弧始まり (?: # 括弧始まり [^\{\}\"\\\\] # {}”¥ を含まない文字 | # もしくは (?: # 括弧始まり \" # ” で始まり (?: # 括弧始まり (?: # 括弧始まり [^\"\\\\] # ”¥ を含まない文字 | # もしくは (?: # 括弧始まり \\\\. # ¥ で始まる任意の(¥を含めて)2文字 ) # 括弧終わり ) # 括弧終わり * # を0回以上 ) # 括弧終わり \" # ” で終わる ) # 括弧終わり ) # 括弧終わり * # を0回以上 ) # 括弧終わり ";
0 件のコメント:
コメントを投稿