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

ITOH Takashi itoh @ tohokuaiki.jp
2005年 6月 24日 (金) 14:02:53 JST


伊藤です。

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) ;

?>


結果は、
honjitsu ha seiten DESU REVTVQ== DESU.
honjitsu ha seiten DESU REVTVQ== DESU.
honjitsu ha seiten DESU default_value DESU.
honjitsu ha seiten DESU DESU DESU.
となりました。
1〜3の場合は問題なく期待通りの結果が得られていますが、
4の場合にメソッドが呼び出されずに$1がそのまま表示されてしまっています。

preg_replaceのe修飾子は、オブジェクトメソッドが使えないのでしょうか?

なおサンプルを動作させた環境は、
MacOSX 10.3.9
PHP 4.3.11
Apache 1.3.33
です。

伊藤




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