2016-12-21 1 views
1

현재 일치하는 텍스트를 굵은 html 행으로 바꾸는 방법을 찾고 있습니다. 원래 문자열을 유지하려고하지만 원래 문자열을 비교하지 않으려 고하므로 특수 문자를 제외하고는 부분적으로 문제가 발생합니다.특수 문자를 무시하면서 부분 문자열 일치 및 바꾸기

예 :

Taco John's is my favorite place to eat. 

그리고 싶은 일치하기 :

Taco John's <b>is my favorite</b> place to eat. 

방법 I :

is my 'favorite' 

가 원하는 결과를 얻으려면 원래 문자열을 감안할 때

현재 m 일치하는 문자열에 추가 따옴표 주위 랩탑 설치하는 것은 그들에게

let regex = new RegExp('('+escapeRegexCharacters(matching_text.replace(/[^a-z 0-9]/gi,''))+')',"gi") 
let html= full_text.replace(/[^a-z 0-9]/gi,'').replace(regex, "<b>$1</b>")}}></span> 

을 대체하여 거의 나는 모든 문장 부호 잃을 것을 제외하고, 작동이 :

Taco Johns <b>is my favorite</b> place to eat 

정규식을 사용 할 수있는 방법, 또는 다른 방법이 있습니까를, 일치하는 과정에서 대소 문자와 특수 문자를 무시하면서 일치하는 구문을 둘러싼 태그를 추가 하시겠습니까?

업데이트 # 1 :

내가 분명 존재하고 있음을 보인다. 나는 최종 결과의 html에 남아 있기 위해 원래 문자열의 puncuation이 필요하다. 그리고 모든 특수 문자와 대소 문자를 무시하기 위해 일치하는 텍스트 로직이 필요합니다. 따라서 is my favoriteis My favoriteis my 'favorite'이 일치해야합니다. 당신이 직접 경기를 가지고,이 경우,이 패턴이지만, 어디

+0

당신이 제공 한 정규식의 요점이 아닙니다 아무것도를 제거하는 것입니다 'AZ' (공백) 또는 숫자. 따라서 구두점 만 제거하십시오 : https://regex101.com/r/M9HrNF/1 –

+0

정규식 문자를 성공적으로 이스케이프하면 영숫자가 아닌 공간을 제거해야하는 이유는 무엇입니까? – Scimonster

+0

@DoTheDew 이제는 일치를 얻기 위해 구두점을 없애고 있지만 최종 결과에 구두점을 유지하고 싶지만 특수 문자를 제거하는 논리를 찾아야합니다. –

답변

1

를 대신에서 특수 문자를 제거하는 문자열이 검색 될 때 발생하는 특수 문자를 건너 뛰는 각 문자와 일치하는 패턴을 정규 표현식에 삽입 할 수 있습니다. 당신이 문자열에 직접 적용 할 수있는 정규 표현식을 구축 그런 식으로 검색되는 및 교체 작업은 따라서 경기 이외의 특수 문자를 터치하지 않습니다 :

let escapeRegexCharacters = 
 
     s => s.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), 
 
    full_text = "Taco John's is My favorite place to eat."; 
 
    matching_text = "is my 'favorite'"; 
 
    regex = new RegExp(matching_text.replace(/[^a-z\s\d]/gi, '') 
 
       .split().map(escapeRegexCharacters).join('[^a-z\s\d]*'), "gi"), 
 
    html = full_text.replace(regex, "<b>$&</b>"); 
 

 
console.log(html);

+0

이것은 거의 정확하게 맞습니다. 그러나 대문자가 일치하지 않으면 실패합니다. 그래서 matching_text가 "My favorite"이라면 일치하지 않을 것이다.하지만 필자는 그것을 필요로한다. 그래서 'i' 플래그를 사용하는 이유는 문자 일치 방식을 사용할 수 있습니까? –

+0

Adapted :'새로운 RegExp()'에'gi' 인수를 추가했습니다. – trincot

+0

나는'gi' 플래그를 잘못된 위치에 추가하려고했습니다. 고맙습니다! 이것은 매우 영리했습니다. –

1

regexps '에 유용합니다, 그래서 좋은 방법은 사용하는 String.prototype.replace :

function wrap(source, part, tagName) { 

    return source 
    .replace(part, 
     `<${tagName}>${part}</${tagName}>` 
    ) 
    ; 
} 

는이 적어도, 경우 패턴을 수정하려면 질문을 편집하고 제공해야합니다.

+0

바꾸기가 정확히 일치하는 특수 문자는 제외하고는 사실입니다. 그래서 "타코 존 (Taco John)을 먹는 것이 내가 가장 좋아하는 곳"입니다. "replace"("내 즐겨 찾기", "아무것도")는 'part'변수의 작은 따옴표로 인해 작동하지 않습니다. –

0

은 "전체 일치하는 하위 문자열"을 의미 $& replacement string로 캡처 그룹을 사용하지 않도록하는 것이 가능하다 :

var phrase = "Taco John's is my favorite place to eat." 
var matchingText = "is my favorite" 

var re = new RegExp(escapeRegexCharacters(matchingText), "ig"); 
phrase.replace(re, "<b>$&</b>"); 

(코드 obarakon의 답변에 따라.)

0

일반화를의 정규식 당신은 is my /w+을 사용할 수 있습니다.당신은 자바 스크립트가 결과 텍스트 조작 할 수 있도록 당신은 대용품 기능에 그것을 사용할 수 있습니다

var str = "Taco John's is my favorite place to eat."; 
 
var html = str.replace(/is my \w*/, function (x) { 
 
    return "<b>" + x + "</b>"; 
 
}); 
 

 
console.log(html);