如何在PHP中使用带有{{mustache}}的preg_replace

时间:2017-01-26 12:46:06

标签: php regex

我正在尝试将一个字符串中所有出现的{{key}}替换为它在数组中的相应键(或stdClass)

我不太确定如何正确构建正则表达式。

例如:

我想制作这个字符串:

"Hi my name is {{name}}, I am {{age}} years old."

这个数组:

$person = [
    "name" => "John",
    "age" => 28,
    "city" => "London",
    "country" => "England",
];

对此:

"Hi my name is John, I am 28 years old."

我考虑过使用str_replace,但这意味着如果我在一个潜在的人身上拥有10k键,它将迭代10k次,而在preg_replace中我只需要替换两次。因此,由于效率低下,使用str_replace NOT 是一个选项。

我也知道正确的正则表达式,但这有可能是无限的$ i,其中$ i是找到的匹配的索引,我也不知道如何做到这一点。

这样做的正确模式和正确的替换是什么?

1 个答案:

答案 0 :(得分:3)

首先,您需要正确定义array

$person = [
     'name' =>'John',
     'age' => '28',
     'city' => 'London',
     'country' => 'England'
];

如果您要使用preg_replace"Now you have 2 problems."那么为什么不在循环中使用str_replace。例如,您的输入是:$string = "Hi my name is {{name}}, I am {{age}} years old."您可以这样做:

while($i = current($person)) {
    $string = str_replace('{{'.key($person).'}}', $i, $string);
    next($person);
}

Live Example

修改

如果您认为$person中的条目数量证明使用正则表达式是合理的,那么您需要使用preg_replace_callback而不是preg_replace,所以您可以索引到array

$string = preg_replace_callback('/{{((?:[^}]|}[^}])+)}}/', function($match) use ($person) { return ($person[$match[1]]); }, $string);

Live Example

由于您仍在使用正则表达式,因此您可以获得处理转义字符的附加功能。如果您对此感兴趣,则需要使用正则表达式:

\G(?:[^{\\]|\\.|{[^{])*{{((?:[^}\\]|\\.|}[^}])+)}}

Live Example

您需要将preg_replace_callback调整为:

$string = preg_replace_callback('/\G((?:[^{\\]|\\.|{[^{])*){{((?:[^}\\]|\\.|}[^}])+)}}/', function($match) use ($person) { return $match[1].$person[$match[2]]; }, $string);

Live Example