我正在尝试将一个字符串中所有出现的{{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是找到的匹配的索引,我也不知道如何做到这一点。
这样做的正确模式和正确的替换是什么?
答案 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);
}
修改强>
如果您认为$person
中的条目数量证明使用正则表达式是合理的,那么您需要使用preg_replace_callback
而不是preg_replace
,所以您可以索引到array
:
$string = preg_replace_callback('/{{((?:[^}]|}[^}])+)}}/', function($match) use ($person) { return ($person[$match[1]]); }, $string);
由于您仍在使用正则表达式,因此您可以获得处理转义字符的附加功能。如果您对此感兴趣,则需要使用正则表达式:
\G(?:[^{\\]|\\.|{[^{])*{{((?:[^}\\]|\\.|}[^}])+)}}
您需要将preg_replace_callback
调整为:
$string = preg_replace_callback('/\G((?:[^{\\]|\\.|{[^{])*){{((?:[^}\\]|\\.|}[^}])+)}}/', function($match) use ($person) { return $match[1].$person[$match[2]]; }, $string);