PHP preg_replace - 使用匹配作为键从数组中查找替换

时间:2010-07-13 12:45:45

标签: php regex preg-replace

我有一个字符串,可以包含多个匹配项(任何由百分比标记包围的单词)和一个替换数组 - 每个替换项的键都是正则表达式的匹配项。有些代码可能会更好地解释......

$str = "PHP %foo% my %bar% in!";
$rep = array(
  'foo' => 'does',
  'bar' => 'head'
);

期望的结果是:

$str = "PHP does my head in!"

我尝试了以下方法,但没有一项工作:

$res = preg_replace('/\%([a-z_]+)\%/', $rep[$1], $str);
$res = preg_replace('/\%([a-z_]+)\%/', $rep['$1'], $str);
$res = preg_replace('/\%([a-z_]+)\%/', $rep[\1], $str);
$res = preg_replace('/\%([a-z_]+)\%/', $rep['\1'], $str);

因此,我转向Stack Overflow寻求帮助。任何人?

4 个答案:

答案 0 :(得分:7)

echo preg_replace('/%([a-z_]+)%/e', '$rep["$1"]', $str);

给出:

PHP does my head in!

请参阅the docs for the modifier 'e'

答案 1 :(得分:2)

您可以使用eval修饰符...

$res = preg_replace('/\%([a-z_]+)\%/e', "\$rep['$1']", $str);

答案 2 :(得分:2)

似乎不推荐使用修饰符“e”。存在安全问题。 或者,您可以使用preg_replace_callback。

$res = preg_replace_callback('/\%([a-z_]+)\%/', 
                             function($match) use ($rep) { return  $rep[$match[1]]; },
                             $str );

答案 3 :(得分:1)

只是提供preg_replace()的替代方法:

$str = "PHP %foo% my %bar% in!";
$rep = array(
  'foo' => 'does',
  'bar' => 'head'
);


function maskit($val) {
    return '%'.$val.'%';
}

$result = str_replace(array_map('maskit',array_keys($rep)),array_values($rep),$str);
echo $result;