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