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

komura komura @ ma9.seikyou.ne.jp
2005年 6月 25日 (土) 01:47:25 JST


komura です。

On Fri, 24 Jun 2005 14:02:53 +0900
ITOH Takashi <itoh @ tohokuaiki.jp> wrote:

> 伊藤です。
> 
> preg_replaceのe修飾子を使いたいのですが、リプレースに
> オブジェクトのメソッドを使おうとするとうまく動作しません。
> 
> 下記、サンプルで説明します。
> 
> <?php
> class Test_class{
>   var $value='default_value';
>   function test_method($foo){
>     return base64_encode($foo);
>   }
> }
> 
> function test_function($foo){
>   return base64_encode($foo);
> }
> 
> $test_obj = new Test_class ;
> $str = 'honjitsu ha seiten hogeDESUhoge.'."\n" ;
> $pattern = "/hoge(.*)hoge/e";
> 
> // 1. 関数を使った場合
> $replacement = "'$1 '.test_function($1).' $1'";
> echo preg_replace($pattern , $replacement , $str) ;
> // 2. 静的に呼び出したクラスメソッドを使った場合
> $replacement = "'$1 '.Test_class::test_method($1) . ' $1'";
> echo preg_replace($pattern , $replacement , $str) ;
> // 3. オブジェクトのプロパティを使った場合
> $replacement = "'$1 ' . $test_obj->value .  ' $1'";
> echo preg_replace($pattern , $replacement , $str) ;
> // 4. オブジェクトのメソッドを使った場合
> $replacement = "'$1 ' . $test_obj->test_method($1) .  ' $1'";
> echo preg_replace($pattern , $replacement , $str) ;
> 
> ?>

以下のようにすれば動作しませんでしょうか?

  $replacement = "'$1 ' . \$test_obj->test_method('$1') . ' $1'";
  echo preg_replace($pattern , $replacement , $str) ;

また、他の例でも同じですが、置き換え部分に指定する関数の引数に文字列
が入る可能性がある場合は、必ずシングルコーテーションで囲む方が良いと
思います。
伊藤さんの例では、$1 に不正な文字列が入るようなことがあると、危険な
PHP コードが実行される可能性もありますので、$str が外部から入力される
文字列の場合は非常に危険です。

-- 
komura <komura @ ma9.seikyou.ne.jp>


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