今天做一个搜索,检索的内容不但是 标题、关键字、还要检索正文中出现的字符,那么正文中出现的字符怎么匹配出来呢?
并把关键字改成成红色呢?
我的思路:
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);
});