ホームページ > php教程 > php手册 > 关键词高亮算法

关键词高亮算法

WBOY
リリース: 2016-06-07 11:42:43
オリジナル
1693 人が閲覧しました

在搜索系统中,经常会有高亮搜索关键词的需要,而在关键词不止一个且容易重叠的时候,普通的关键词高亮算法就容易出错了。所以这里介绍一下我自己想到的算法。如果有问题可以给我发邮件~ Email:me@filowlee.com
    /**<br>      * 设置关键词高亮的字符串处理函数<br>      * @param [string] $str      [要高亮的字符串]<br>      * @param array  $word_arr [关键词]<br>      */<br>     public function setKeyWords($str,$word_arr=array()){<br>         // 设置多字节字符内部编码为utf8<br>         mb_internal_encoding("UTF-8");<br>         // 创建一个跟字符串长度一致的数组,用0填充<br>         $map=array_fill(0,mb_strlen($str),0);<br>         // 遍历关键词数组,将关键词对应的map数组的位置上的数字置为1<br>         foreach ($word_arr as $value) {<br>             $pos=-1;<br>             $pos_count=0;<br>             $pos_arr=array();<br>             // 如果找到了这个关键词,就将这个词的位置存入位置数组中(来支持多次出现此关键词的情况)<br>             while(($pos=mb_strpos($str,$value,$pos+1))!==false && $pos_count                 $pos_arr[]=$pos;<br>                 $pos_count++;<br>             }<br>             // 遍历数组,将对应位置置1<br>             foreach ($pos_arr as $pos_val) {<br>                 if($pos_val!==false){<br>                     $fill=array_fill($pos_val,mb_strlen($value),1);<br>                     $map = array_replace($map,$fill);<br>                 }<br>             }<br>             $pos=null;<br>         }<br> <br>         // 遍历map数组,加入高亮代码<br>         $flag=0;<br>         $position=-1;<br>         $result="";  // 结果数组<br>         foreach ($map as $key => $value) {<br>             if($value==1){<br>                 // 如果第一次出现1,则加上html标签头<br>                 if($flag==0) $result.="<span>";<br>                 $flag=1;<br>             }else{<br>                 // 如果已经到了一个0,但上一个还是1时,加入html标签尾<br>                 if($flag==1){<br>                     $position=$key-1;<br>                     $flag=0;<br>                     $result.="</span>";<br>                 }<br>             }<br>             // 将该位置的字符加入结果字符串中<br>             $result.=mb_substr($str,$key,1);<br>         }<br>         return $result;<br>     }附上一个简单的关键词分离代码;    $query_words=explode(" ",trim($str));<br>     foreach ($query_words as $key => $value) {<br>         if(!$value) unset($query_words[$key]);<br>     }

AD:真正免费,域名+虚机+企业邮箱=0元

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート