2017-04-13 133 views
-1

下面的代码将接受一个输入并通过评论列表运行,以查找关键字,并用关键字包围关键字并突出显示该关键字。如何排除锚标签?

这几乎可以工作,只不过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

一招的目的是处理这种“找一个字,但不是一个特定的语境”的案件在这里描述: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>