我正在尝试将一个字符串中所有出现的{{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
但是这意味着如果我在一个潜在的人身上有1万个键,它将重复进行1万次,而在preg_replace
我替换两次之后。因此,使用str_replace
是不是由于恶劣效率的选择。
我也知道正确的正则表达式,但是它可能有无限的$ i,其中$ i是找到的匹配项的索引,我不确定该怎么做。
什么是正确的模式以及正确的替换方式?
首先,您将要正确定义一个array
:
$person = [
'name' =>'John',
'age' => '28',
'city' => 'London',
'country' => 'England'
];
如果您要使用preg_replace
,则“现在有2个问题。” 那么,为什么不直接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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句