-->

2010-03-23

php の 正規表現 (Perl 互換) 入れ子 サンプル

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