PHP正则表达式替换括号内的内容

时间:2016-12-26 17:19:59

标签: php

我正在使用"短代码"替换数据库中保存的文本内容的功能。

我试图在双括号{{ }}内找到所有出现的内容,查看是否存在替换,如果存在,请替换它。我对正则表达式不好,我不知道这是否是最有效的方法:

$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

我想为"短代码"做好准备。不存在,只是简单地将其留在内容中。

2 个答案:

答案 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);