«

PHP将标题搜索结果中的关键词替换标注为红色

时间:2024-3-3 10:48     作者:韩俊     分类: PHP


PHP将标题搜索结果中的关键词替换成为标注的红色,同时在2023年1月11日后,将毛票票中搜索功能中检索着急词时标注为红色时的中文乱码BUG也修复好了 。同时保持搜索词在结果中匹配的字母大小写,又不影响原标题中的大小写样式。

代码中标明了处理想法和逻辑以下为最新代码:

function keyword_replace($keyword){
    if ($keyword!=''){
        $search_nohave   = array(",","/", "\\", ".", ";", ":", "\"", "!", "~", "`", "^", "(", ")", "?", "-", "\t", "\n", "'", "<", ">", "\r", "\r\n", "$", "&", "%", "#", "@", "+", "=", "{", "}", "[", "]", ":", ")", "(", ".", "。", ",", "!", ";", "“", "”", "‘", "’", "[", "]", "、", "—", " ", "-", "…");
        foreach ($search_nohave as $search_rep){
            $keyword = str_replace($search_rep,"",$keyword); 
        }
        return $keyword;
    }
}

function keywordlight($keyword,$rstitle){

    /*2023年1月11日后,毛票票修复被搜索词标红色BUG*/

    $keyword = keyword_replace($keyword);//替换不想要的字符可以自己修改
    $keyword = str_replace(' ','',$keyword);
    $keyword_list='';

    if ($keyword!==''){

        //将搜索的词逐个分开
        $str_qwm = '';
        for($i=0; $i<strlen($keyword); $i++){
            $str_c=mb_substr($keyword,$i,1,'gb2312');
            $keyword_list .= $str_c.",";
        }

        //生成搜索词数组
        $keyword_list=explode(',',trim($keyword_list,","));

        //去掉重复搜索词,只保留一个,生成新的搜索词数组
        $keyword_list = array_unique($keyword_list);

        //将标题分隔成循环,空格不替换保持原来的样子
        $str_title='';
        for($i=0; $i<strlen($rstitle); $i++){
            $str_d=mb_substr($rstitle,$i,1,'gb2312');
            $str_title = $str_title.$str_d.",";
        }

        //生成标题数组
        $str_title_list=explode(',',trim($str_title,","));  
        $echo_str='';

        //把标题的每一个字都循环判断,符合条件的着红色
        for($i = 0; $i <count($str_title_list); $i++){

            $title_key=$str_title_list[$i];

            //在搜索词数组中,如果数组中有$str_title_list[$i]表示是被要标红的字,注:同时判断搜索词可能是大写或是小写
            if (in_array(strtoupper($title_key), $keyword_list) || in_array(strtolower($title_key), $keyword_list)){

                //这是判断当前标题中的字是大写还是小写
                //因为替换后也要保持原来的大小写样式(str_replace区分大小写,直接用str_ireplace会造成不区分,可是会影响原标题大小写样式,强迫症就复杂一点多判断一下保持原样子)

                if (preg_match('/^[A-Z]+$/', $title_key)){//正则判断是大写
                    $echo_str.=str_replace($title_key,"<font color='red'>".strtoupper($title_key)."</font>",$title_key);
                }elseif(preg_match('/^[a-z]+$/', $str)){//正则判断是小写
                    $echo_str.=str_replace($title_key,"<font color='red'>".strtolower($title_key)."</font>",$title_key);
                }else{//非大小写则直接标红色
                    $echo_str.=str_replace($title_key,"<font color='red'>".$title_key."</font>",$title_key);
                }

            }else{
                $echo_str.=$title_key;
            }
        }

        return $echo_str;

    }else{
        return $rstitle;
    }

}  

 

标签: php php教程

热门推荐