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

San*_*530 20 html regex replace

我有这个HTML:

"This is simple html text <span class='simple'>simple simple text text</span> text"
Run Code Online (Sandbox Code Playgroud)

我只需匹配任何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>");
}
Run Code Online (Sandbox Code Playgroud)
  • 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>
Run Code Online (Sandbox Code Playgroud)

我不想替换里面的任何文字

<span class='simple'>simple simple text text</span>
Run Code Online (Sandbox Code Playgroud)

它应该与更换前相同.

Jer*_*rry 68

好的,试试这个正则表达式:

(text|simple)(?![^<]*>|[^<>]*</)
Run Code Online (Sandbox Code Playgroud)

示例适用于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.
Run Code Online (Sandbox Code Playgroud)

如果textsimple在html标签之间,负向前瞻将阻止匹配.

  • 是啊!谢谢你!谢谢你!谢谢你!你是我的英雄!:) (2认同)
  • @Sanya530 :( 也许尝试转义正斜杠`(text|simple)(?![^&lt;]*&gt;|[^&lt;&gt;]*&lt;\/)`?我不知道IE在什么引擎上运行,但如果它类似于 Javascript,那应该可以解决问题。 (2认同)