PHP preg_replace正则表达式问题

时间:2011-02-19 00:47:04

标签: php regex preg-replace

我需要帮助找出正则表达式。在我的脚本中,我有一个带占位符的行。我想要做的是我想要为每个占位符文本发送一个函数,将其转换为它应该是什么。

E.g。我的文字是:

  

Lorem ipsum dolor坐 {{AMETPLACEHOLDER}} ,   奉献精神。

我希望将 AMETPLACEHOLDER 文本发送到我的函数translateMe

我在正则表达式中非常糟糕,但无论如何都试了一下。我没有比这更进一步:

$sString    = preg_replace("(*.?)/\{{(*.?)}}(*.?)/", $this->echoText('\\2'), $sString);

哪个当然不起作用。

有人可以帮帮我吗?

BR, 保罗佩伦

2 个答案:

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