我正在使用"短代码"替换数据库中保存的文本内容的功能。
我试图在双括号{{ }}
内找到所有出现的内容,查看是否存在替换,如果存在,请替换它。我对正则表达式不好,我不知道这是否是最有效的方法:
$string = "This is a {{test}} to see if it {{works}}";
$regex = ""; // Unfortunately, I'm clueless when it comes to regex
preg_match_all($regex, $string, $matches);
$replacements = array(
'test' => 'sample',
'works' => 'exists'
);
foreach ($matches as $match) {
if (array_key_exists($match, $replacements)) {
$string = str_replace($match, $replacements[$match], $string);
}
}
return $string;
在这个例子中,我想回复:
This is a sample to see if it exists
我想为"短代码"做好准备。不存在,只是简单地将其留在内容中。
答案 0 :(得分:3)
如果您事先知道双括号中的关键字,您甚至不需要正则表达式。只需拨打str_replace()
就可以了:
$string = "This is a {{test}} to see if it {{works}}";
$replacements = array(
'{{test}}' => 'sample',
'{{works}}' => 'exists',
);
$text = str_replace(array_keys($replacements), array_values($replacements), $string);
但是如果你想要替换所有的关键词,即使那些你没有替换的关键词,正则表达式也是不可避免的,函数preg_replace_callback()
可以解决:
$string = "This is a {{test}} to see if it {{works}}";
$replacements = array(
'{{test}}' => 'sample',
'{{works}}' => 'exists',
);
$text = preg_replace_callback(
'/\{\{[^}]*\}\}/',
function (array $m) use ($replacements) {
return array_key_exists($m[0], $replacements) ? $replacements[$m[0]] : '';
},
$string
);
由于{
和}
在正则表达式中为special characters,因此它们必须为escaped才能被解释为普通字符(并忽略其特殊含义)。
每次正则表达式匹配字符串的一部分时,都会调用anonymous function(回调)。 $m[0]
始终包含与整个正则表达式匹配的字符串部分。如果正则表达式包含subpatterns,则$m
在不同位置可以使用与每个子模式匹配的字符串部分。我们使用的表达式中没有子模式,$m
在索引0
包含单个值。
回调返回的值用作替换匹配整个表达式的字符串部分。
答案 1 :(得分:1)
你可以这样做:
$string = "This is a {{test}} to see if it {{works}}";
$regex = "|\{\{(.*)\}\}|";
$replacements = [
'test' => 'sample',
'works' => 'exists'
];
preg_replace_callback($regex, function($matches) use($replacemnets) {
if (isset($replacements[$matches[0]]) {
return $replacements[$matches[0];
}
else {
return $matches[0];
}
}, $string);