Heim >php教程 >php手册 >关键词高亮算法

关键词高亮算法

WBOY
WBOYOriginal
2016-06-07 11:42:431709Durchsuche

在搜索系统中,经常会有高亮搜索关键词的需要,而在关键词不止一个且容易重叠的时候,普通的关键词高亮算法就容易出错了。所以这里介绍一下我自己想到的算法。如果有问题可以给我发邮件~ 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元

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn