【问题标题】:Regex replace text outside html tags正则表达式替换 html 标签外的文本
【发布时间】:2024-01-23 00:53:01
【问题描述】:

我有这个 HTML:

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

我只需要匹配任何 HTML 标记之外的单词。我的意思是,如果我想匹配“simple”和“text”,我应该只从“This is simple html text”和最后一部分“text”中得到结果——结果将是“simple” 1 match,“text” 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 &lt;span class='simple'&gt;simple simple text text&lt;/span&gt; text"

我需要用&lt;span&gt; 包装所有选定的单词(在本例中是“简单”)。但我只想包装 any 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>

应该和替换前一样。

【问题讨论】:

  • 您能否在问题中提及您使用的语言以及替换的预期结果?
  • @Jerry,示例已添加。

标签: html regex replace


【解决方案1】:

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

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

如果textsimple 位于html 标记之间,则负前瞻将阻止匹配。

【讨论】:

  • 耶!谢谢!谢谢!谢谢!你是我的英雄! :)
  • @Sanya530 :( 也许尝试转义正斜杠(text|simple)(?![^&lt;]*&gt;|[^&lt;&gt;]*&lt;\/)?我不知道 IE 在什么引擎上运行,但如果它类似于 Javascript,那应该可以解决问题。
  • 对不起!这是我在 JS 中的错误。一切都在 IE8 中完美运行。谢谢!
  • 我花了两天时间才弄明白。非常感谢您,先生!
  • @A.Seddighi 您必须在否定前瞻中为特定的 &lt;a&gt; 标签使用模式
【解决方案2】:
^([^<]*)<\w+.*/\w+>([^<]*)$

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

【讨论】:

  • 谢谢!如果我想在标签之外获得所有“简单”匹配,这个例子会是什么样子?我问的原因是我需要获取正则表达式模式,然后替换标签外所有匹配的“简单”单词。