如何将搜索结果高亮

用sphinx做搜索,结果返回给php,碰到两个问题.一个是如何将搜索高亮.一个是如何将带有关键词的第一段内容截取. 高亮的问题,有了一个思路.首先要将搜索内容进行分词,然后通过正则匹配将分词后的关键词全部匹配,这样的话也不会影响整个关键词的高亮. 比如说,要搜索的关键词为:我爱你中国. 这里会将关键词分词为: 我 爱 你 中国. 如果在全文中有一段是: 我爱你中国,亲爱的母亲. 那么最后的结果就是: 中国,亲的母亲 其次,对于英文的高亮,需要能做到大小写不敏感,即关键词为大写时,全文内的匹配的相应小写也会高亮,而且不会被替换成关键词的大写. mmseg已经可以完美的进行分词了,那接下来的事情就比较简单了:

function highLight($str, $keywords, $color = "red") {
    if (empty($keywords)) {
        return $str;
    }
    $keywords = split("[ \t\r\n,]+", $keywords);
    $str_begin = "##~~##~";
    $str_end   = "~##~~##";
    foreach($keywords as $val) {
        $tvar = preg_quote($val);
        $tvar = str_replace('/', '\/', $tvar);
        $patterns[]    = "/(" . $tvar . ")/";
        $replacement[] = $str_begin . urlencode($val) . $str_end;
        $tvar = preg_quote(urlencode($val));
        $tvar = str_replace('/', '\/', $tvar);
        $tmppattern[]  = "/(" . $str_begin . $tvar . $str_end . ")/";
        $finalrep[]    = "<span style='color:" . $color . "'>" . $val . "</span>";
    }
    $str = preg_replace($patterns, $replacement, $str);
    $str = preg_replace($tmppattern, $finalrep, $str);
    return $str;
}

$str = highLight('我爱你中国,亲爱的母亲','中国 我 爱 你');
echo $str;