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