在搜索中突出显示多个关键字(非英文字符)

时间:2011-10-26 21:50:38

标签: php preg-replace

找到此功能以突出显示帖子highlight multiple keywords in search

中搜索字符串中的关键字
function highlight($text, $words) {
    preg_match_all('~\w+~', $words, $m);
    if(!$m)
        return $text;
    $re = '~\\b(' . implode('|', $m[0]) . ')\\b~i';
    return preg_replace($re, '<b>$0</b>', $text);
}

但它对非英语字符不起作用,我怎样才能调整它以适用于非英语字符。 åäöô等。

2 个答案:

答案 0 :(得分:0)

您确定要搜索 unicode 字符吗? \ w仅匹配[a-zA-Z0-9 _]。

例如,这匹配波斯数字:

preg_match( "/[^\x{06F0}-\x{06F9}\x]+/u" , '۱۲۳۴۵۶۷۸۹۰' );

来源:http://php.net/manual/en/function.preg-match.php

只需创建一个包含您想要匹配的字符的字符类。

答案 1 :(得分:0)

在页面加载所需的编码后,最好使用JS:

function paint_keys( str_to_replace , words ){
temp_reg = str_to_replace;
if( /\s/g.test( temp_reg ) ) temp_reg = temp_reg.split( " " ); // Breaking our searching keywords into an array;
else return words.split( temp_reg ).join( "<span class='painted'>" + temp_reg + "</span>" );
for( z = 0 ; z < temp_reg.length ; z++ ){
    if( temp_reg[ z ] != "" ) words = words.split( temp_reg[ z ] ).join( "<span class='painted'>" + temp_reg[ z ] + "</span>" );
}
return words;
}

当然,您可以将<span class='painted'>" + temp_reg + "</span>替换为您需要的任何内容。

如果你只需要通过php完成它 - 使用按explode( "\s" , $words );打破数组键的原则 - 这将只给你一个符号数组,然后循环替换每个单词的字符串数组。