如何排除锚标签?

How to exclude anchor tags?

下面的代码将接受一个输入,然后 运行 它通过评论列表查找关键字,并将用突出显示它的 Mark 标记包装关键字。

除了 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+)/,"(<[^>]+>)*(<[^>]+>)*");

        var pattern = new RegExp("("+term+")", "gi");

        reviews = reviews.replace(pattern, "<mark></mark>");
        reviews = reviews.replace(/(<mark>[^<>]*)((<[^>]+>)+)([^<>]*<\/mark>)/,"</mark><mark>");

        reviewList.html(reviews);
    }
}

此处描述了旨在处理此类 "find a word but not a specific context" 情况的技巧:http://www.rexegg.com/regex-best-trick.html

本质上是:匹配不需要的上下文或(使用交替)你的模式。然后根据匹配的替代方案,按原样替换为第一个(即不需要的上下文)或用标记标记包围的第二个。

所以替换

var pattern = new RegExp("("+term+")", "gi");
reviews = reviews.replace(pattern, "<mark></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>