/****************************************************************************
*** strKeyCut 关键词全文搜索语法显示函数
***
*** $rsstr :待处理字符串
*** $keywords :关键词数组
*** $keycolor :是否语法高亮显示,默认=显示
*** $length :指定字符串处理后长度,默认=200
*** $cutlen :指定关键词前后保留文字长度,默认=10
****************************************************************************/
function strKeyCut($rsstr,$keywords,$keycolor=true,$length=200,$cutlen=10){
if (!$rsstr) return FALSE;
if (!is_array($keywords) or (1>count($keywords))) return FALSE;
$encoding=mb_internal_encoding();
mb_internal_encoding("UTF-8");//设置当前字符集为UTF8
$rsstr=preg_replace('/\s(?=\s)/', '', $rsstr); //连续的空格只保留一个
$pos=array();
foreach($keywords as $keys=>$words){ //查找关键词位置
$offset=0;
while($thepos=mb_strpos($rsstr,$words,$offset)){
$pos[]=$thepos;
$offset=$thepos+1;
}
}
sort($pos); //关键词位置按先后排序
$strs=array();
$strs[]=mb_substr($rsstr,0,$pos["0"]); //按关键词的位置分割字符串
for ($i=0;$i
$strs[]=mb_substr($rsstr,$pos[$i]);
$outstr=array(); //对已分割的字符串长度进行处理
//第一个分割串中没有关键词,单独处理
$outstr[]=(($length>mb_strlen($rsstr)) or ($cutlen>mb_strlen($strs["0"]))) ? $strs["0"] : "... " . mb_substr($strs["0"],mb_strlen($strs["0"])-$cutlen);
for ($i=1;$i
if (($cutlen+$cutlen+3)>=mb_strlen($strs[$i])) $outstr[]=$strs[$i];//如果关键词出现的位置较近,则不断句
else{
$lstr=mb_substr($strs[$i],0,$cutlen+3);//关键词后边保留一部分语句
$rstr=mb_substr($strs[$i],mb_strlen($strs[$i])-$cutlen);//下一个关键词前面保留一部分语句
$outstr[]=$lstr . " ... " . $rstr;
}
}
$outstr[]=mb_substr($strs[$i],0,$cutlen);//处理最后一个分割串
$out= implode("",$outstr);//合并分割串
$out= mb_substr($out,0,$length) . " ..."; //按指定长度作最后裁切
if ($keycolor){
foreach ($keywords as $key=>$data){
$keycolors[$key]="".$data.""; //关键词修饰
}
$out=str_replace($keywords,$keycolors,$out);
}
mb_internal_encoding($encoding);//恢复字符集
return $out;
}