今天做一个搜索,检索的内容不但是 标题、关键字、还要检索正文中出现的字符,那么正文中出现的字符怎么匹配出来呢?
并把关键字改成成红色呢?
我的思路:
1、首先使用 like 关键字母 检索到所有包含内容的文章
2、把正文中包含此字符的内容截取出来
(1、去掉正文中所有的html标签。2、得到关键字出现的位置。并以它为中心从两边各自剪切出15个字符进行拼接;如出现多次,需要遍历拼接。)
3、展现在页面上
4、通过js正则表达式的替换改变颜色。
第一、顾名思义,不用多说,从数据库中查找出 带有关键字的文章列表。
$list=M("Article")->field("id,title,body") ->where("title like '%$key%' or body like '%$key%'")->select();
使用like 进行检索,会带来效率问题,如果数据库检索数量比较大,需进行优化。
第二、整理正文中的字符并显示出来
stripos($str,$search); //返回search 在字符串 str中出现的位置。但不支持中文 mb_strpos($str,$search,0,"utf-8"); //这种写法完全可以得到$search 中文 在 $str中出现的位置。 $body=html_entity_decode($val['body']); $val['body']=str_replace(" ","",strip_tags($body)); //获取到匹配字符的所有内容,并返回 $pattern="/$key/i"; $decration=""; $qianhouzf=60; if(preg_match($pattern,$val['body'])){ $start=0; preg_match_all($pattern,$val['body'],$res); //P($res); foreach($res[0] as $rk){ $viewIndex=mb_strpos($val['body'],$key,$start,"utf-8"); $start=$viewIndex+1; $keylength=mb_strlen($key,"utf-8"); if($viewIndex<$qianhouzf){ if($decration!=""){ $decration.=mb_substr($val['body'],$viewIndex,$keylength+$viewIndex+$qianhouzf,"utf-8"); }else{ $decration.=mb_substr($val['body'],0,$keylength+$viewIndex+$qianhouzf,"utf-8"); } }else{ //P($viewIndex); $decration.=mb_substr($val['body'],$viewIndex-$qianhouzf,$keylength+$qianhouzf*2,"utf-8"); } } }
第三、显示内容
<if condition="$list"> <foreach name="list" item="item"> <div class="media" style="border-bottom: 1px solid #ddd;"> <div class="media-body"> <h4 class="media-heading headt"> <a href="{:U("detail",array("id"=>$item['id']))}" target="_blank" >{$item['title']}</a> </h4> <if condition="$item['decration'] eq ''"> <p style="line-height: 1.6;font-size: 1em;max-height: 185px;">{$item['title']}</p> <else /> <p style="line-height: 1.6;font-size: 1em;max-height: 185px;">{$item['decration']}</p> </if> </div> </div> </foreach> </if>
第四、js替换
$(".mylist .media").each(function(e,i){ var con=$(this).html(); var pattern=new RegExp($("#title_k").val(),"ig"); //var pattern=/javascript/ig; //alert(pattern.test("a")); con=con.replace(pattern,"<span style='color:red;font-size:16px;margin:0px 5px;'>"+$("#title_k").val()+"</span>"); $(this).html(con); });