$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 件のコメント:
コメントを投稿