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