用方法调用替换双大括号占位符作为 preg_replace() 的替换参数

问题描述 投票:0回答:2

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

例如我的文字是:

Lorem ipsum dolor 坐 {{AMETPLACEHOLDER}}, consectetur adipiscing elit.

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

translateMe

我在正则表达式方面真的很糟糕,但无论如何还是尝试了一下。我没有比这更进一步了:

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

这当然行不通。

php regex callback preg-replace placeholder
2个回答
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


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);
© www.soinside.com 2019 - 2024. All rights reserved.