Подтвердить что ты не робот

Regex заменить текст вне html-тегов

У меня есть этот HTML:

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

Мне нужно сопоставить только те слова, которые находятся за пределами любого тега HTML. Я хочу сказать, что если я хочу сопоставить "простой" и "текст" , я должен получить результаты только из "Это простой html-текст", а последняя часть "текст" - результат будет "простым" 1 совпадением, "текст" 2 Матчи. Может ли кто-нибудь помочь мне с этим? Im использует 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>

Он должен быть таким же, как и перед заменой.

4b9b3361

Ответ 1

Хорошо, попробуйте использовать это регулярное выражение:

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

Пример работал над regex101.

Структура:

(         # 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.

Отрицательный lookahead предотвратит совпадение, если text или simple находится между html-тегами.

Ответ 2

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

Однако это очень наивное выражение. Было бы лучше использовать парсер DOM.