帝国CMS 实现搜索结果关键字高亮的方法
微wx笑
2019-08-07【帝国CMS】
304
14
0关键字:
帝国cms 正则 搜索 关键字 高亮 关键词
没有哪个搜索引擎不实现搜索结果关键字高亮的,那样的话用户体验会很差;然而就这样重要的一个功能,帝国CMS默认却没有实现!具体原因不知道,可能有其商业目的,但这让帝国CMS在我心中的感觉,就差了很多。
目录
帝国CMS 实现搜索结果关键字高亮的方法,我所使用的版本是:7.5
没有哪个搜索引擎不实现搜索结果关键字高亮的,那样的话用户体验会很差;然而就这样重要的一个功能,帝国CMS默认却没有实现!具体原因不知道,可能有其商业目的,但这让帝国CMS在我心中的感觉,就差了很多。
实现方法:
修改e/search/result/index.php,在大约109行(这个文件可能被我修改过)找到如下代码:
1 | $listtext = str_replace ( "<!--list.var" . $changerow . "-->" , $repvar , $listtext ); |
然后在这行下面添加一行代码,目的是进行关键词的替换:
1 | $listtext = str_replace ( $search_r [keyboard], "<font color='red'>$search_r[keyboard]</font>" , $listtext ); |
保存,即可实现关键字描红的高亮显示效果!
测试效果如下图所示:
你会发现一个问题,存在大小写敏感的问题,有的没有被替换,为了解决这个问题,我们需要使用以下代码:
1 | $listtext = str_ireplace ( $search_r [keyboard], "<font color='red'>$search_r[keyboard]</font>" , $listtext ); |
str_ireplace 是 str_replace 的忽略大小写版本
定义和用法
str_ireplace() 函数替换字符串中的一些字符(不区分大小写)。
该函数必须遵循下列规则:
如果搜索的字符串是一个数组,那么它将返回一个数组。
如果搜索的字符串是一个数组,那么它将对数组中的每个元素进行查找和替换。
如果同时需要对数组进行查找和替换,并且需要执行替换的元素少于查找到的元素的数量,那么多余元素将用空字符串进行替换
如果是对一个数组进行查找,但只对一个字符串进行替换,那么替代字符串将对所有查找到的值起作用。
注释:该函数不区分大小写。请使用 str_replace() 函数来执行区分大小写的搜索。
注释:该函数是二进制安全的。
语法
1 | str_ireplace(find,replace,string,count) |
参数 | 描述 |
---|---|
find | 必需。规定要查找的值。 |
replace | 必需。规定替换 find 中的值的值。 |
string | 必需。规定被搜索的字符串。 |
count | 可选。一个变量,对替换数进行计数。 |
详情请参考:https://www.w3school.com.cn/php/func_string_str_ireplace.asp
但这依然存在一个问题,就是本来大写的,替换后变成了小写的。
如果要解决这个问题,就要使用正则表达式了,代码如下:
1 2 3 | if (0 != strlen ( $search_r [keyboard])){ $listtext =preg_replace( "/" .preg_quote( $search_r [keyboard], "/" ). "/i" , "<font color='red'>$0</font>" , $listtext ); } |
关于正则表达式的使用,请参考:https://www.runoob.com/php/php-pcre.html
2021-04-15更新
当你搜索英文关键词的时候可能会发现,链接里也多了类似“<font color='red'>$0</font>”的东西,导致链接地址错误,页面打不开了。
为了解决这个问题,我们要修改两个文件
1、/e/search/result/index.php
我们定义一个“$keyword”的变量,然后把它传给“ReplaceListVars”方法,把之前添加的代码注释掉。
2、/e/class/connect.php
大概在3094行,我们为“ReplaceListVars”方法添加一个参数“$keyword”
在去除html代码块后面添加,因为在之前的话就会被过滤掉了,加了也不生效
1 2 3 | if (! empty ( $keyword )){ $value =preg_replace( "/" .preg_quote( $keyword , "/" ). "/i" , "<font color='red'>$0</font>" , $value ); } |
还有对标题的处理
1 2 3 4 5 | $cmsTitle = $r [oldtitle]; if (! empty ( $keyword )){ $cmsTitle =preg_replace( "/" .preg_quote( $keyword , "/" ). "/i" , "<font color='red'>$0</font>" , $cmsTitle ); } $listtemp = str_replace ( '[!--oldtitle--]' , $cmsTitle , $listtemp ); |
注意:我上面图中少画了一行代码。
本文由 微wx笑 创作,采用 署名-非商业性使用-相同方式共享 4.0 许可协议,转载请附上原文出处链接及本声明。
原文链接:https://www.ivu4e.cn/blog/EmpireCMS/2019-08-07/96.html