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

发布于 2024-10-18 06:48:57 字数 467 浏览 2 评论 0原文

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

例如我的文字是:

Lorem ipsum dolor sat {{AMETPLACEHOLDER}}, consectetur adipiscing elit。

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

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

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

这当然行不通。

I need some help figuring out an regular expression. In my script I have a certain line with placeholders. What I want to do is I want to send every placeholder text a an function that translates it to what it should be.

E.g. my text is:

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

I want the text AMETPLACEHOLDER to be send of to my function translateMe.

I am really bad in regex but gave it a try anyways. I don't get further than this:

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

Which off course doesn't work.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

风追烟花雨 2024-10-25 06:48:57

使用 preg_replace_callback,你可以指定这样的方法:

 = preg_replace_callback("@{{(.*?)}}@", array($this, "echoText"), $txt)

方法可以是:

 public function echoText($match) {
     list($original, $placeholder) = $match;   // extract match groups
     ...
     return $translated;
 }

Btw,用于设计正则表达式检查out http://regular-expressions.info/ 或以下列出的一些工具: https://stackoverflow.com/questions/89718/is-there-开源世界中类似 regexbuddy 的任何东西

Using preg_replace_callback, you can specify a method like this:

 = preg_replace_callback("@{{(.*?)}}@", array($this, "echoText"), $txt)

And the method could be:

 public function echoText($match) {
     list($original, $placeholder) = $match;   // extract match groups
     ...
     return $translated;
 }

Btw, for designing regular expressions check out http://regular-expressions.info/ or some of the tools listed in: https://stackoverflow.com/questions/89718/is-there-anything-like-regexbuddy-in-the-open-source-world

夜深人未静 2024-10-25 06:48:57

您需要使用 /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);

You need to use either the /e modifier to parse the replacement to eval, or use preg_replace_callback().

eg.

$sString = preg_replace("#\{\{(*.?)\}\}#e", 'echoText("$2")', $sString);

But the $this will cause problems there, if you are using 5.3+ you could use a closure to create a function to cope with that, or create a callback:

$sString = preg_replace_callback("#\{\{(*.?)\}\}#", array($this, 'echoText'), $sString);

$this->echoText() would have to be modified to catch the match array rather than the string in that case.

Or with an anonymous function:

$sString = preg_replace_callback("#\{\{(*.?)\}\}#", function ($matches) {
               return $this->echoText($matches[1]);
           }, $sString);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文