如何排除锚标签?

时间:2017-04-13 07:54:04

标签: javascript jquery regex regex-negation

下面的代码将接受输入并通过查看列表来查找关键字,并将带有标记的关键字包装,以突出显示该关键字。

除了在锚标签之间找到关键字时,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);
    }
}

1 个答案:

答案 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>

相关问题