[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 メーリングリストの案内