2011-02-19 94 views
3

我需要一些帮助来找出正则表达式。在我的脚本中,我对占位符有一定的限制。我想要做的是我想发送每个占位符文本一个函数,将其转换为它应该是。PHP preg_replace正则表达式问题

E.g.我的文字是:

Lorem存有悲坐{{AMETPLACEHOLDER}}, consectetur adipiscing ELIT。

我想要的文字AMETPLACEHOLDER被发送到我的功能translateMe

我真的很糟糕的正则表达式,但试了一试。我没有得到更进一步的:

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

偏离哪个课程不起作用。

有人可以帮我吗?

BR, 保罗Peelen

回答

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

+0

Thnx。它工作完美。当我得到时间时,我会检查你的链接。应该真的与正则表达式。 – 2011-02-19 01:03:21

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