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

寻技术 PHP编程 / React 2023年07月08日 113

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

关闭

用微信“扫一扫”