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