为什么这个preg_replace会跳过替换文本的第一个实例?

时间:2010-11-04 19:05:41

标签: php preg-replace

在下面的替换脚本中,如果$ myKeyword为“test”且替换文本为“This,test可以是测试”,我希望替换后的文本为“This,< b> test”可以是< em>测试< / em>“

然而,我得到的是:这个,测试可以是< b>测试< / b>。

我正在尝试确定为什么它会跳过关键字“test”的第一个实例。

function save_rseo_content($content){
    global $post;
    $mykeyword = rseo_getKeyword($post);
    $mykeyword = " ".preg_quote($mykeyword, '/');

     /*had to add " " before keyword so that the it skips the instance
       where the keyword has already been formatted. Only matches " keyword"*/

    $theContent = 
    preg_replace_callback("/\b($mykeyword)\b/i","doReplace", $content);
return $theContent;
}

function doReplace($matches)
{
    static $count = 0;
    switch($count++) {
    case 0: return ' <b>'.trim($matches[1]).'</b>';
    case 1: return ' <em>'.trim($matches[1]).'</em>';
    case 2: return ' <u>'.trim($matches[1]).'</u>';
    default: return $matches[1];
        }
}

1 个答案:

答案 0 :(得分:0)

不是在关键字之前检测空格,而是对于&gt;使用负向外观可能更好。字符:

preg_replace_callback("/\b(?<!>)($mykeyword)\b/i","doReplace", $content);