2017-04-13 2 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>

관련 문제