[PHP-users 20468]Re: 再帰(?)正規表現置換について
Osamu Shigematsu
shige @ ravi.ne.jp
2004年 2月 19日 (木) 21:09:20 JST
重松です。こんにちは。
> ''の中では \'と書くことで'自身を使えますよ。
これは知りませんでした。かなり得した気分です。
# けど、これも変な仕様かも。
で、このことがわかると、
$text = str_replace('\"', '"', $text);
の理由もわかります。要するに、stripslashes() に食わせたいところですが、
そうなると、'' の中に含めない ' が含まれてしまい、式の評価に失敗してしま
うためですね。
逆に、mb_ereg_replace($p, $r, $str, 'se') でやると、こっちは、そのままの
ようなので、'' の中に ' が残り、エラーになりました。
で、解決策としては、mb_ereg 系が使える場合には、こちらを使い、最初に、'
を ' に変換しておき、後は普通に '' でくくって再帰処理をすれば、スマー
トですね。
preg_replace() の場合も、同様にして、' を変換した後に、stripslashes() を
使えば、str_replace() よりも短くかけます。
# ' は理論上存在しないので、stripslashes() でいけるはず。。。
それから、もう一点気づいたことは、配列を再帰処理部分にも渡すと、すでに置
換済みの処理を再度実行しますね。コードの量は短く、すっきりしますが、処理
速度的にはいけてません。テンプレートのパースのように、一度っきりならいい
でしょうが、通常使う場合は、要注意かもしれません。
また、{each} -- {/each} 部分で、関数を一番最初に持ってくるために、{each}
以前をキャプチャしていたのですが、よく考えたら (よく考えなくても)、別の
変数にとっておけばよいですね。
e 修飾子で渡す PHP スクリプトは「式」であればよいので、
(変数 .= 関数化) ? 作った関数の呼び出し : ''
のようにして、変数に貯めるようにしたのですが、C の場合だと、
1 #include <stdio.h>
2
3 int main() {
4 int x = (1, 2, 3);
5 printf("%d\n", x);
6 return 0;
7 }
のように書けば、左辺、x に代入されるは、当然一番右にある式 3 になるので
すが、PHP はパースエラーになります。なんだかな...。
いえ、単に式の結果を捨てたいだけなんですが。
--
Osamu Shigematsu <shige @ ravi.ne.jp>
PHP-users メーリングリストの案内