正则表达式替换html标记之外的文本

时间:2013-09-04 18:50:52

标签: html regex replace

我有这个HTML:

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

我只需要匹配任何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是我要匹配的字词(在本例中为“simple”)
  • 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>

应与更换前相同。

2 个答案:

答案 0 :(得分:64)

好的,请尝试使用此正则表达式:

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

Example worked on 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.

如果html标记之间有textsimple,则否定前瞻会阻止匹配。

答案 1 :(得分:1)

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

然而,这是一个非常天真的表达。最好使用DOM解析器。