我有从服务器返回的搜索结果和一个使用搜索查询中的单词突出显示结果的正则表达式。
words = searchQuery.split(' ');
$.each(words, function() {
var word = this.trim();
var regex = new RegExp('(' + word + ')(?!>|b>)', 'gi');
searchResult = searchResult.replace(regex, "<b>$1</b>");
});
这很好用,直到我搜索到这样的内容:
搜索字词:“javascript脚本”
搜索结果:“java 脚本是一种编程语言......”
它应突出显示“ javascript 是一种编程语言......”这样的全文。但是,由于字符串已从“javascript”更改为“java <b>
脚本</b>
”,因此它不再与搜索查询中的第二个字匹配。当word
的值为“b”,“/”,“&lt;”时,它也会产生奇怪的值或“&gt;”。
我的问题是我如何忽略正则表达式中的<b>
和</b>
标记,并且只匹配原始搜索查询?我尝试使用lookahead,但它没有用。
答案 0 :(得分:1)
我认为按字符串长度对数组进行降序排序可以解决这个问题:
words = searchQuery.split(' ');
words.sort(function(a, b){
return b.length - a.length;
});
$.each(words, function() {
var word = this.trim();
var regex = new RegExp('(' + word + ')(?!>|b>)', 'gi');
searchResult = searchResult.replace(regex, "<b>$1</b>");
});
答案 1 :(得分:0)
你不能通过正则表达式忽略字符串中的任何内容。尝试使用“\ b”
搜索整个单词
var searchQuery = 'script with lang javascript';
var searchResult = 'javascript is a programming language';
words = searchQuery.split(' ');
$.each(words, function() {
var word = this.trim();
var regex = new RegExp('\\b(' + word + ')\\b(?!>|b>)', 'gi');
searchResult = searchResult.replace(regex, "<b>$1</b>");
});
console.log(searchResult);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>