通过正则对搜索的内容进行高亮显示
首先,要想到用户可能输入任意字符,所以要先处理正则里面的有特殊意义的字符。如下:
function pregQuote_(str){ return str.replace(/([\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\|\:])/g, '\\$1'); }
做好了上面的基本处理,要对搜索的内容进行高亮显示,一般来说只需要做进行一个简单的替换就好:
如下:
/* searchValue:搜索的内容 pregSearchValue:处理后的搜索内容 sourceValue:需要进行搜索的内容 */ pregSearchValue = pregQuote_(searchValue); var re = new RegExp(pregSearchValue,'g'); sourceValue = sourceValue.replace(re,'<b>' + searchValue + '</b>');
但是,如果我们对某段内容进行搜索,而这段内容是html格式,那么,我们就会希望对标签内的内容不进行搜索,而只对显示的内容进行搜索。那么我们就需要修改我们的替换正则了。
如下:
/* searchValue:搜索的内容 pregSearchValue:处理后的搜索内容 sourceValue:需要进行搜索的内容 */ pregSearchValue = pregQuote_(searchValue); var re = new RegExp('([^>]*)' + pregSearchValue + '([^>]*<)', 'g'); sourceValue = sourceValue.replace(re,'$1<b>' +searchValue+'</b>$2'); var re2 = new RegExp('(>[^<]*)' +pregSearchValue + '([^<]*)', 'g'); sourceValue = sourceValue.replace(re2,'$1<b>' + searchValue +'</b>$2');
但是这个正则只适用于这段内容存在html标签,如果不存在的话就则用前面那个简单的匹配就好了。
如果这段html出现一些<>这种符号,则会影响上面那个正则的判断。
这个时候,我们需要把这段html改成html标准的源码格式,这样出现在显示内容中的<>就会变成<>这种格式的。同时搜索内容也要进行这种转义的替换,确保搜索的内容和线上的内容转换成相同内容的不同格式。
最终代码如下:
/*sourceText:为转义过的html*/ var tempNode = document.createElement('div'); tempNode.innerHTML = sourceValue; sourceText = tempNode.innerHTML; function highLightedText(searchValue,sourceText){ /*sourceText:为转义过的html*/ var tempNode = document.createElement('div'); tempNode.innerHTML = sourceValue; sourceText = tempNode.innerHTML; searchValue = searchValue.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>') pregSearchValue = pregQuote_(searchValue); if(if(sourceText.indexOf('<')!=-1){ var re = new RegExp('([^>]*)' + pregSearchValue + '([^>]*<)', 'g'); sourceText = sourceText.replace(re,'$1<b>' +searchValue+'</b>$2'); var re2 = new RegExp('(>[^<]*)' +pregSearchValue + '([^<]*)', 'g'); sourceText = sourceText.replace(re2,'$1<b>' + searchValue +'</b>$2'); }else{ var re = new RegExp(pregSearchValu, 'g'); sourceText = sourceText.replace(re,'<b>' + searchValue +'</b>'); } return sourceText; }
不过,由于做了两次遍历,所以会对部分内容做两个<b>的嵌套。不过也不影响效果。
相关推荐
杨德龙 2020-11-11
不要皱眉 2020-10-14
满地星辰 2020-09-16
梦的天空 2020-08-25
lrjnlp 2020-07-19
qidu 2020-07-05
flyingssky 2020-07-05
flyingssky 2020-06-27
RuoShangM 2020-06-17
天高任鸟飞 2020-06-13
Darklovy 2020-06-11
qidu 2020-06-08
Darklovy 2020-06-07
jyj00 2020-06-06
flyingssky 2020-06-04
山水沐光 2020-05-26
山水沐光 2020-05-25