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

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


重松です。宇野さん、こんにちは。
いろいろ試してくださってありがとうございます。

> http://www.php.net/manual/ja/function.preg-replace.php
> のツッコミ欄でsteven -a-t- acko dot netさんがこの問題に言及しているのを
> 見つけました。

情報ありがとうございます。
よく読んでみます。

> ・back referenceで値を突っ込むときには「"」はエスケープされて「\"」になる
> ・「\"」を''の間に入れたら、それを/eで解釈したときに\"のまま戻らない
> という理屈で、'solution'は「\"」だけ特殊扱いして「"」に戻す処理を入れろ、
> だそうなので、

思いっきり対症療法ですね。
原因としては、不完全に文字列をクオートすることなので、PCRE 側のバグ、と
いっていい気がしないでもないです。

> $r = array(
>   '<?php echo $\1; ?>',
>   "'<?php if (\\1 @ count(\$\\2)) { ?>'.preg_replace(\$p, \$r, str_replace('\\\"','\"','\\3')).'<?php } ?>'",
>   "'<?php function template_'.++\$i.'(\$_ary) { foreach(\$_ary as \$_val) { extract(\$_val, EXTR_OPTION); ?>'.
>   preg_replace(\$p, \$r, str_replace('\\\"','\"','\\3')).
>   '<?php }} ?>\\1<?php template_'.\$i.'(\$\\2); ?>'");
> 
> かな?

テストコードまで書いてくださってありがとうございます。
変数名の部分は " がマッチすることはないので問題ないですが、それ以外は、
マッチするので、全部 str_replace で処理をしなければなりませんね。

テンプレートから php スクリプトに変換するのは一度だけなので、
多少オーバヘッドがありますが、str_replace でも、まあいいかなと思っていま
す。

とりあえず、" のクオート問題を片付けたものをアップロードしておきました。

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

それにしても、鮎川さんのアイデアで驚くほど少ないコーディングの量で、ずい
ぶん楽ができそうです。

どうも、デザイナーの人は、論理的に構造を考えるのではなく、全体の見た目で
デザインするようなので、テンプレートは、GUI エディタで編集できないと、使っ
てもらえないし、高度なものだと、覚えてもらえないので、シンプルなものが一
番だなと痛感してます。

後は、入れ子で同じ変数名だと、うまく対をマッチできない問題を考えたいと思
います。

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



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