[PHP-users 25902] Re: preg_replaceのe修飾子でオブジェクトのメソッドを使う

ITOH Takashi itoh @ tohokuaiki.jp
2005年 6月 25日 (土) 10:46:19 JST


伊藤です。
komuraさんありがとうございます。

> 以下のようにすれば動作しませんでしょうか?
> 
>   $replacement = "'$1 ' . \$test_obj->test_method('$1') . ' $1'";
>   echo preg_replace($pattern , $replacement , $str) ;

確かに動作いたしました。

また、セキュリティ面からいただいたアドバイスもですが、preg_replaceで
evalされるときに、どういった手順を踏んでPHPがevalしているのかを

PHP-usersの宇野さんの投稿
http://ns1.php.gr.jp/pipermail/php-users/2004-February/020991.html
や、オンラインマニュアルの突っ込み欄から、
http://jp2.php.net/manual/ja/function.preg-replace.php#39713
http://jp2.php.net/manual/ja/function.preg-replace.php#47735
http://jp2.php.net/manual/ja/function.preg-replace.php#52369
を参考にして考え、

1.evalに渡す文字列にaddslashesを行う
2.その文字列に対して、$1 $2..を埋め込む
3.evalする
という手順だと思いますが、これだと逆になんで

// 3. オブジェクトのプロパティを使った場合
> $replacement = "'$1 ' . $test_obj->value .  ' $1'";
を
// 3. オブジェクトのプロパティを使った場合
> $replacement = "'$1 ' . \$test_obj->value .  ' $1'";
としてみたところ、同じ結果になるのかが不思議です。
私の期待では前者は
default_value
で、後者は
\default_value
というようになると思ったのですが。

伊藤



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