$str = '<div class="hello">{author}</div><div id="post_{id}"><div class="content">{content}</div></div>';
$pattern = '/\{([a-z _0-9]+)\}/i';
$subst= array('author'=>'Mr.Google','id'=>'1239124587123','content'=>'This is some simple text');
$str = preg_replace($pattern,$subst['$1'],$str);
echo $str;
{text}
的每个实例都变成“”我是否在捕获组中出错?我是使用
preg_match_all
执行此操作并返回{author}
而author
此问题是否在这里引导?
答案 0 :(得分:3)
在这种情况下,您需要 preg_replace_callback :
$str = preg_replace_callback($pattern, function ($matches) use ($subst) {
return $subst[$matches[1]];
}, $str);
另一种解决方案是使用 strtr 功能:
// $subst needs to be changed a bit.
$subst= array('{author}'=>'Mr.Google','{id}'=>'1239124587123','{content}'=>'This is some simple text');
echo strtr($str, $subst);
答案 1 :(得分:1)
在函数运行之前,评估preg_match_all
的第二个参数。 (像所有参数一样。)
启用正确的error_reporting,PHP将告诉您:注意:未定义的索引:[...] 中的$ 1
你不能这样做,因为$1
只会引用捕获的内容,当函数找到匹配项时 - 你需要使用preg_replace_callback
代替:
$str = preg_replace_callback(
$pattern,
function($matches) use ($subst) {
return $subst[$matches[1]];
},
$str
);
编辑:如果你不能使用匿名函数,这应该适用于PHP&lt; 5.3.0:
$str = preg_replace_callback($pattern, 'my_custom_replacement_function', $str);
function my_custom_replacement_function($matches) {
global $subst;
return $subst[$matches[1]];
}