【问题标题】:preg_replace: reference object in replacementpreg_replace:替换中的引用对象
【发布时间】:2009-09-07 16:13:52
【问题描述】:

您知道在 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 );

我无法让这个主题有任何变化。我收到的消息之一是:无法将对象 Model_User 转换为字符串。

但是,当然,将 $this 表示的对象转换为字符串不是我的意图……我想获取与占位符匹配的对象的属性(当然没有百分号)。

我认为使用 /e 修饰符我走在正确的轨道上。但也不完全确定这一点。也许这可以更简单地实现?

对此有什么想法吗?提前谢谢你。

【问题讨论】:

    标签: object reference preg-replace


    【解决方案1】:

    就像我对 Paul 的回答发表的评论一样:与此同时,我自己找到了解决方案。解决方案比我想象的要简单得多。我不应该使用双引号。

    解决方法就这么简单:

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

    希望这可以帮助其他人以供将来参考。

    干杯。

    【讨论】:

    • 我也学到了一些东西 - 我很惊讶 $this 参考在这种情况下有效!
    • 好吧,那我想我的问题毕竟不是徒劳的。 :) 干杯。
    • 如果您仍在使用双引号,您只需像这样在 preg_replace 调用中转义美元符号: preg_replace("~(%(.*?)%)~e", "\ $this->\\2", $template);
    【解决方案2】:

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

    【讨论】:

    • 嗨,保罗,感谢您的指点。但我已经知道 preg_replace_callback 了。我希望没有它也能做到这一点。你认为这可能吗?我认为应该,但无法获得正确的语法。
    • 嗨,保罗,再次感谢您的努力。但正如您经常看到的那样:如果您再试一次,您会在提出问题后找到解决方案。在这种情况下,我也找到了解决方案。 :-/ 这比我想象的要简单得多。我将在此处发布解决方案作为答案。
    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2011-01-24
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    相关资源
    最近更新 更多