下面的代码将接受输入并通过查看列表来查找关键字,并将带有标记的关键字包装,以突出显示该关键字。
除了在锚标签之间找到关键字时,REGEX也会替换关键字。
如何更改下面的正则表达式以忽略锚标记?
非常感谢任何帮助。
谢谢。
inputHighlight: function(){
let currentURL = document.location.toString(),
reviewList = $('.review-list');
if(currentURL.indexOf('kw') !== -1){
var reviews = reviewList.html();
var term = utilities.queryString.getQueryValue("kw");
term = term.replace(/(\s+)/,"(<[^>]+>)*$1(<[^>]+>)*");
var pattern = new RegExp("("+term+")", "gi");
reviews = reviews.replace(pattern, "<mark>$1</mark>");
reviews = reviews.replace(/(<mark>[^<>]*)((<[^>]+>)+)([^<>]*<\/mark>)/,"$1</mark>$2<mark>$4");
reviewList.html(reviews);
}
}
答案 0 :(得分:0)
此处描述了旨在处理此类“找到一个词而非特定上下文”案例的技巧:http://www.rexegg.com/regex-best-trick.html。
本质上它是:匹配不需要的上下文或(使用交替)你的模式。然后根据匹配的替代方案,用第一个(即不需要的上下文)替换,或者用标记标记包围第二个。
所以替换
var pattern = new RegExp("("+term+")", "gi");
reviews = reviews.replace(pattern, "<mark>$1</mark>");
与
var pattern = new RegExp("<a\\b[^>]*>.*?<\/a>|("+term+")", "gi");
reviews = reviews.replace(pattern, function(match, p1) {
return p1 ? "<mark>" + p1 + "</mark>" : match;
});
<强>演示:强>
var term = "TEST TERM"
var reviews = document.getElementById("reviews").innerHTML;
var pattern = new RegExp("<a\\b[^>]*>.*?<\/a>|("+term+")", "gi");
reviews = reviews.replace(pattern, function(match, p1) {
return p1 ? "<mark>" + p1 + "</mark>" : match;
});
document.getElementById("reviews").innerHTML = reviews;
<div id="reviews">
TEST TERM
<a href="#">TEST TERM</a>
</div>