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

Osamu Shigematsu shige @ ravi.ne.jp
2004年 2月 18日 (水) 11:06:00 JST


重松です。こんにちは。

あれからいろいろと試してみて、いくつかの問題点に気づきました。

まず、

$str = '<!--{def x}--><!--{def y}-->"$z"<!--{/def y}--><!--{/def x}-->';

を処理すると、一回 preg_replace で処理されるごとに " が \" に変換され、
上記だと、都合 2 回変換されるため、 "$z" の部分が、\\"$z\\" となってしま
います。

そのため、

$r = "'<?php if (@count($\\1)) { ?>'.preg_replace(\$p, \$r, \"\\2\").'<?php }

のようにすると、今度は、$ の部分が PHP 変数として解釈されてしまいます。

マニュアル http://jp.php.net/pcre をそれなりの時間をかけて確認したつもり
なのですが、" を \" に変換している挙動についての解説を見つけることができ
ませんでした。この挙動に関してどこを確認すればよいのか、ご存知の方がいらっ
しゃいましたら、お知らせいただければ助かります。

mb_ereg 系も試せばいいんでしょうが、mb_ereg 系を使わない理由は、Mac OS X 
用に開発しているものがあり、Panther では標準で mb_ereg 系が使えないので、
pcre を使っています。

また、{def}{/def} 以外に、{each}{/each} というのがあり、これは入れ子で使
用することがあるのですが、

{each x}{each x}二重ループ{/each x}{/each x}{each x}別のループ{/each x}

だとかは、非欲張りにすると、最初の {each x} から最初の {/each x} にマッ
チしますし、欲張りにすると、最初の {each x} から最後の {/each x} にマッ
チしてしまいます。

今は、非欲張りで、同じ名前の each、あるいはそういう必要は論理的にないも
のの def も、入れ子にできないのは仕様、ってことでよいのかなとも思うので
すが、これまた、うまい方法というのはあるのでしょうか?

とりあえず、上記の問題を抱えたままですが、作りかけのソースをアップしてお
きました。

	http://www.ravi.ne.jp/~shige/?html_template

PHPカイハツ日記の鮎川さんのテンプレートのパクリなんですが、氏のものは機
能が豊富すぎるので、必要なものだけに絞ろうとしているうちにはまってしまい
ました。

もしよろしければ、ソースのほうで、意図を汲んでいただけると、助かります。
お気づきの点だとか、もっと美しい実装だとか、ありましたら、コメントをいた
だければ幸いです。

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



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