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