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