作为程序员一定要保持良好的睡眠,才能好编程

如何获取汉字在字符串中的位置(mb_strpos)

发布时间:2016-06-26

今天做一个搜索,检索的内容不但是 标题、关键字、还要检索正文中出现的字符,那么正文中出现的字符怎么匹配出来呢?

并把关键字改成成红色呢?


我的思路:

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);
});


b55.png