2011-02-19 147 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);