您知道有什么方法可以在 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 修饰符我走在正确的轨道上。但对此也不完全确定。也许这可以更简单地实现?
对此有什么想法吗?预先感谢您。
就像我对保罗的回答的评论:同时我自己找到了解决方案。解决方案比我想象的要简单得多。我不应该使用双引号。
解决方案就这么简单:
$result = preg_replace( '~(%(.*?)%)~e', '$this->\\2', $template );
希望这对其他人有帮助,以供将来参考。
干杯。
查看 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 );