0

preg_replace の置換部分でオブジェクトを参照する方法を知っていますか。文字列内のプレースホルダー (パーセント記号で区切られている) をオブジェクトの属性の値に置き換えようとしています。これはオブジェクト自体で実行されるので、/e 修飾子を使用して $this を参照するあらゆる方法を試しました。このようなもの:

/* for instance, I'm trying to replace
 * %firstName% with $this->firstName
 * %lastName% with $this->lastName
 * etc..
 */
$result = preg_replace( '~(%(.*?)%)~e', "${'this}->{'\\2'}", $template );

このテーマのバリエーションを機能させることはできません。私が受け取っているメッセージの 1 つは、オブジェクト Model_User を文字列に変換できません。

しかしもちろん、$this で表されるオブジェクトを文字列に変換するつもりはありません... プレースホルダーに一致するオブジェクトの属性を取得したい (もちろんパーセント記号はありません)。

/e 修飾子で正しい軌道に乗っていると思います。しかし、これについても完全にはわかりません。多分これはもっと簡単に達成できますか?

これについてのアイデアはありますか?前もって感謝します。

4

2 に答える 2

2

私がポールの答えにコメントしたように:その間に私は自分で解決策を見つけました。解決策は私が思っていたよりもはるかに簡単です。二重引用符を使うべきではありませんでした。

解決策は次のように簡単です。

$result = preg_replace( '~(%(.*?)%)~e', '$this->\\2', $template );

これが将来の参考のために他の誰かに役立つことを願っています。

乾杯。

于 2009-09-07T16:27:16.000 に答える
0

preg_replace_callbackを確認してください。使用方法は次のとおりです。

class YourObject
{

    ...

    //add a method like this to your class to act as a callback
    //for preg_replace_callback...
    function doReplace($matches) 
    {
        return $this->{$matches[2]};
    }

}

//here's how you might use it
$result = preg_replace_callback(
    '~(%(.*?)%)~e', 
    array($yourObj, "doReplace"), 
    $template);

または、/e 修飾子を使用して、これを試すこともできます。あなたのケースで機能させる唯一の方法は、オブジェクトをグローバルスコープに入れることだと思います

$GLOBALS['yourObj']=$this;
$result = preg_replace( '~(%(.*?)%)~e', "\$GLOBALS['yourObj']->\\2", $template );
于 2009-09-07T16:15:39.410 に答える