[PHP-users 20447]Re: 再帰(?)正規表現置換について

Osamu Shigematsu shige @ ravi.ne.jp
2004年 2月 19日 (木) 09:31:45 JST


重松%家に詳説正規表現を忘れてきたです。
みわさん、こんにちは。

>    $nest = 1;
>    $pattern = array_fill ( 0, $nest,
>      '/<!--{(def\s+([A-Za-z][A-Za-z0-9_]*))}-->'.
>      '(((?>(?:(?!<!--{\/?\1}-->).)+?)|(?R))*?)'.
>      '<!--{\/def\s+\2}-->/s' );
>    $replacement = array_fill ( 0, $nest,
>      '<?php if (@count($\2)) { ?>\3<?php } ?>' );
>    $result = preg_replace ( $pattern, $replacement, $str );

この部分ですが、別に $nest でやらなくても、$pattern で一番外の 
{def}{/def} の正しい組み合わせがマッチすれば、後は、宇野さんが前回ご指摘
くださった e 修飾子で、再帰処理することができますから、入れ子の深さが理
論的に制限されることはないはずです。
# 無論、無限には再帰処理はできないですが、現実には問題にならないかと。

というわけで、早速テストしてみました。

$str  = '<!--{def a}--><!--{def  b}--><!--{def a}-->xxx<!--{/def a}--><!--{/def
 b}--><!--{/def a}-->' . "\n";
$str .= '<!--{def a}--><!--{!def a}--><!--{def a}-->xxx<!--{/def a}--><!--{/!de
 a}--><!--{/def a}-->';

$p = '/<!--{((!?)def\s+(\w+))}-->'.
        '(((?>(?:(?!<!--{\/?\1}-->).)+?)|(?R))*?)'.
        '<!--{\/\2def\s+\3}-->/se';

if (preg_match($p, $str, $match))
        var_dump($match);

$r = "'<?php if (\\2 @ count(\$\\3)) { ?>'.preg_replace(\$p, \$r, str_replace('\\
"', '\"', '\\4')).'<?php } ?>'";
echo preg_replace($p, $r, $str);

?>

とりあえずうまく動いているようです。


-- 
Osamu Shigematsu <shige @ ravi.ne.jp>



PHP-users メーリングリストの案内