[PHP-users 20428]Re: 再帰(?)正規表現置換について
Osamu Shigematsu
shige @ ravi.ne.jp
2004年 2月 18日 (水) 15:25:23 JST
重松です。こんにちは。
> これ以上入れ子に
> なるとダメですが。見当違いでしたらすみません。
だめだと思います。
{def} に関しては、開く部分 {def} と閉じる部分 {/def} がそれぞれ
<?php if (@count(変数)) { ?> と <?php } ?> なので囲まれた部分に対して、
何回か正規表現置換を適用することができます。
ただし、この場合でも、マッチしなくなるまで繰り返さないと、入れ子の深さに
制限ができてしまいます。
{def} 以外に {each} というのを作っていて、これは、php の foreach 構文に
展開するのですが、その際、関数化して、変数の名前の衝突を防止するようにし
たいので、この場合、複数回の置換処理を適用する、というアプローチは取れま
せん。
とりあえず、" は \" になるのですが、' はエスケープされないようなので、当
面は、' をつかってしのいで、原因を突き止めてみたいと思います。
> あと,現時点で
> http://www.ravi.ne.jp/~shige/?html_template
> に繋がらないようです。覗いてみたいんですが。
私のころでは見えてるんですが。。。
現状それほど長いコードでもないので、本体部分だけ貼り付けます。
class html_template
{
function parse($src, $val)
{
$dst = $src . '.tmp';
if (filemtime($src) > @filemtime($dst)) {
html_template::_parse($src, $dst);
}
include($dst);
}
function _parse($src, $dst)
{
$p = array(
'/\{([^\W_]\w*)\}/',
'/<!--\{(!?)def\s+([^\W_]\w*)\}-->(.*?)<!--\{\/\1def\s+\2\}-->/se',
'/^(.*?)<!--\{each\s+([^\W_]\w*)\}-->(.*?)<!--\{\/each\s+\2\}-->/se');
$r = array(
'<?php echo $\1; ?>',
"'<?php if (\\1 @ count(\$\\2)) { ?>'.preg_replace(\$p, \$r, '\\3').'<?php } ?>'",
"'<?php function template_'.++\$i.'(\$_ary) { foreach(\$_ary as \$_val) { extract(\$_val, EXTR_OPTION); ?>'.
preg_replace(\$p, \$r, '\\3').
'<?php }} ?>\\1<?php template_'.\$i.'(\$\\2); ?>'");
$i = 0;
file_put_contents($dst,
'<?php extract($val, EXTR_OPTION); ?>' .
preg_replace($p, $r, file_get_contents($src)));
}
}
--
Osamu Shigematsu <shige @ ravi.ne.jp>
PHP-users メーリングリストの案内