[PHP-users 25906] Re: preg_replaceのe修飾子でオブジェクトのメソッドを使う
komura
komura @ ma9.seikyou.ne.jp
2005年 6月 25日 (土) 20:31:08 JST
komura です。
On Sat, 25 Jun 2005 10:46:19 +0900
ITOH Takashi <itoh @ tohokuaiki.jp> wrote:
> > 以下のようにすれば動作しませんでしょうか?
> >
> > $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'";
> としてみたところ、同じ結果になるのかが不思議です。
似たような感じですが、この2つの例に関しては、PHP 側の動作は大きく
違います。
一度、以下のコードを実行してみてください。
// 1)
$replacement = "'$1 ' . $test_obj->value . ' $1'";
echo $replacement . "\n";
// 2)
$replacement = "'$1 ' . \$test_obj->value . ' $1'";
echo $replacement . "\n";
以下が preg_replace() で評価されるコードになります。
1) '$1 ' . default_value . ' $1'
2) '$1 ' . $test_obj->value . ' $1'
> 私の期待では前者は
> default_value
> で、後者は
> \default_value
> というようになると思ったのですが。
1) は、preg_replace() で評価される前の $replacement に格納する処理
で既に $test_obj->value は defalut_value になっていることが分かり
ます。
2) は、preg_replace() で評価された時に $test_obj->value が評価され、
default_value になります。
--
komura <komura @ ma9.seikyou.ne.jp>
PHP-users メーリングリストの案内