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