我需要帮助找出正则表达式。在我的脚本中,我有一个带占位符的行。我想要做的是我想要为每个占位符文本发送一个函数,将其转换为它应该是什么。
E.g。我的文字是:
Lorem ipsum dolor坐 {{AMETPLACEHOLDER}} , 奉献精神。
我希望将 AMETPLACEHOLDER 文本发送到我的函数translateMe
。
我在正则表达式中非常糟糕,但无论如何都试了一下。我没有比这更进一步:
$sString = preg_replace("(*.?)/\{{(*.?)}}(*.?)/", $this->echoText('\\2'), $sString);
哪个当然不起作用。
有人可以帮帮我吗?
BR, 保罗佩伦
答案 0 :(得分:5)
使用preg_replace_callback,您可以指定如下方法:
= preg_replace_callback("@{{(.*?)}}@", array($this, "echoText"), $txt)
方法可以是:
public function echoText($match) {
list($original, $placeholder) = $match; // extract match groups
...
return $translated;
}
顺便说一下,设计正则表达式时,请查看http://regular-expressions.info/或以下列出的一些工具:https://stackoverflow.com/questions/89718/is-there-anything-like-regexbuddy-in-the-open-source-world
答案 1 :(得分:4)
您需要使用/e
修饰符将替换解析为eval
,或使用preg_replace_callback()。
例如
$sString = preg_replace("#\{\{(*.?)\}\}#e", 'echoText("$2")', $sString);
但是$this
会导致问题,如果你使用5.3+,你可以使用闭包来创建一个函数来处理它,或者创建一个回调:
$sString = preg_replace_callback("#\{\{(*.?)\}\}#", array($this, 'echoText'), $sString);
在这种情况下,必须修改 $this->echoText()
来捕获匹配数组而不是字符串。
或使用匿名函数:
$sString = preg_replace_callback("#\{\{(*.?)\}\}#", function ($matches) {
return $this->echoText($matches[1]);
}, $sString);