Object preg_replace:替换中的引用对象

Object preg_replace:替换中的引用对象,object,reference,preg-replace,Object,Reference,Preg Replace,您知道在preg_replace的替换部分中引用对象的任何方法吗。我试图用对象的属性值替换字符串中的占位符(用前面的符号分隔)。这将在对象本身中执行,因此我尝试了各种方法使用/e修饰符引用$This。大概是这样的: /* for instance, I'm trying to replace * %firstName% with $this->firstName * %lastName% with $this->lastName * etc.. */ $result = pr

您知道在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 );
我不能让这个主题有任何变化。我收到的消息之一是:无法将对象模型用户转换为字符串

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

我认为使用/e修饰符是正确的。但也不能完全肯定这一点。也许这可以实现得简单得多

有什么想法吗?提前感谢您。

退房-以下是您可以如何使用它

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

正如我对保罗的回答所说:在这期间,我自己找到了解决办法。解决办法比我想象的要简单得多。我不应该用双引号

解决方案如下所示:

$result = preg_replace( '~(%(.*?)%)~e', '$this->\\2', $template );
希望这对其他人有帮助,以供将来参考


干杯。

嗨,保罗,谢谢你的指点。但我已经知道preg_replace_回调了。我希望没有它也能做到这一点。你认为这可能吗?我想应该是这样的,但是没有正确的语法。嗨,保罗,再次感谢你的努力。但正如你经常看到的:如果你再尝试一次,你会在提出问题后找到解决方案。在这种情况下,我也找到了解决方案。:/这比我想象的要简单得多。我将在这里发布解决方案作为一个答案。我也学到了一些东西-我很惊讶$this参考在这种情况下起作用!好吧,那么我想我的问题终究不是白费力气干杯。如果您仍然使用双引号,您只需在preg\u replace调用中避开美元符号,如下所示:preg\u replace(“~(((.*))~e”,“\$this->\\2”,$template);