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