2013-09-04 2 views
13

나는이 HTML이있다. 내 말은 "단순한"텍스트와 "텍스트"를 일치 시키려면 "간단한 html 텍스트"와 마지막 부분 인 "텍스트"- 결과는 "간단한"1 일치, "텍스트"2 성냥. 누구든지 이걸 도와 줄 수 있니? 나는 jQuery를 사용하고있다. 정규식 대체 텍스트는

var pattern = new RegExp("(\\b" + value + "\\b)", 'gi'); 

if (pattern.test(text)) { 
    text = text.replace(pattern, "<span class='notranslate'>$1</span>"); 
} 
  • value

  • text 내가 선택한 모든 단어를 포장 할 필요가 "This is simple html text <span class='simple'>simple simple text text</span> text"

이다 ("간단한"이 경우) 내가 일치 할 단어입니다 (이 예에서입니다 "간단하다"). <span>. 그러나 외부의 단어 만 포장하고 싶습니다. HTML 태그. 이 예제의 결과는

This is <span class='notranslate'>simple</span> html <span class='notranslate'>text</span> <span class='simple'>simple simple text text</span> <span class='notranslate'>text</span> 

내가 뭔가를 교체 이전과 동일해야합니다

<span class='simple'>simple simple text text</span> 

내부의 텍스트를 대체하지 않을 수 있어야합니다.

+0

사용하시는 언어에 대해 말씀해 주시겠습니까? 질문에 대한 교체 결과를 알려주십시오. – Jerry

+0

@Jerry, 예제가 추가되었습니다. – Sanya530

답변

50

좋아,이 정규식을 사용해보십시오 :

(text|simple)(?![^<]*>|[^<>]*</) 

Example worked on regex101합니다.

내역 : text 또는 simple HTML 태그 사이에있는 경우에는 부정적 예측이 일치하는 항목을 방지 할 수

(  # Open capture group 
    text # Match 'text' 
|   # Or 
    simple # Match 'simple' 
)   # End capture group 
(?!  # Negative lookahead start (will cause match to fail if contents match) 
    [^<]* # Any number of non-'<' characters 
    >  # A > character 
|   # Or 
    [^<>]* # Any number of non-'<' and non-'>' characters 
    </  # The characters < and/
)   # End negative lookahead. 

.

+0

예! 고맙습니다! 고맙습니다! 고맙습니다! 너는 나의 영웅이야! :) – Sanya530

+0

하지만 IE8 ... 작동하지 않습니다 : ( – Sanya530

+0

@ Sanya530 :(슬래시 이스케이프 시도 ('text | simple) (? <]*> | [^ <>] * <\ /)'? IE의 엔진이 무엇인지 압니까. 자바 스크립트와 비슷하다면 그 일을해야합니다. – Jerry

1
^([^<]*)<\w+.*/\w+>([^<]*)$ 

그러나 이것은 매우 순진한 표현입니다. DOM 파서를 사용하는 것이 좋습니다.

+0

고마워요! 그리고 만약이 예제가 어떻게 생겼을지를 태그 밖에서 모두 '단순한'매치로 만들고 싶다면? 내가 묻는 이유는 정규식 패턴을 가져와 태그 외부의 '단순한'단어의 모든 일치 항목을 대체해야하기 때문입니다. – Sanya530