preg_replace正则表达式什么都不输出

时间:2014-05-29 02:10:41

标签: php regex preg-replace

    $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此问题是否在这里引导?

2 个答案:

答案 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]];
}