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>
Он должен быть таким же, как и перед заменой.
Ответы
Ответ 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.