/**
* 关键词高亮
*
* @param string $content 要处理的文本
* @param string|array $segs 要高亮的关键词或关键词数组
* @param integer $length 截取长度
* @param string $before_match 匹配之前插入的文本
* @param string $after_match 匹配之后插入的文本
* @param string $suffix 后缀
* @return string 关键词高亮之后的文本
*/
function hightLight($content, $segs, $length = 100, $before_match = '',
$after_match = '', $suffix = "...")
{
// 先截取指定长度
$content = truncate($content, $length, $suffix);
if (is_array($segs)) {
// 过滤重复
$segs = array_unique($segs);
if (count($segs) == 1) {
$segs = $segs[0];
}
}
if (is_string($segs)) {
// 如果只有一个关键词,直接替换就好了
return str_replace($segs, $before_match . $segs . $after_match, $content);
} else {
// 按长度倒序排序
if(is_array($segs)){
foreach ($segs as $seg) {
$temp[$seg] = mb_strlen($seg, "utf-8");
}
}
arsort($temp);
// 搜索关键词位置
$positions = array();
$content_len = mb_strlen($content, "utf-8");
if (is_array($temp)) {
foreach ($temp as $seg => $len) {
$offset = 0;
while ($offset < $content_len
&& ($pos = mb_strpos(mb_strtolower($content, "utf-8"), mb_strtolower($seg, 'utf-8'), $offset, "utf-8")) !== FALSE)
{
if (!isset($positions[$pos])) {
$seg = mb_substr($content, $pos, $len, "utf-8");
$positions[$pos] = array($seg, $len);
}
$offset = $pos + $len;
}
}
}
// 没有匹配的词? 直接返回
if (!$positions) {
return $content;
}
// 将位置排序
ksort($positions);
$offset = 0;
$result = "";
foreach ($positions as $pos => $val) {
list($seg, $len) = $val;
if ($pos >= $offset) {
if ($pos != 0) {
$result .= mb_substr($content, $offset, $pos - $offset, "utf-8");
}
$result .= $before_match . $seg . $after_match;
$offset = $pos + $len;
} else if ($pos + $len > $offset) {
$result = mb_substr($result, 0, -(mb_strlen($after_match, "utf-8") + $offset - $pos), "utf-8");
$result .= $seg . $after_match;
$offset = $pos + $len;
}
}
// 拼接剩余的部分
$result .= mb_substr($content, $offset, $content_len, "utf-8");
// 返回结果
return $result;
}
}