28

我有这个 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匹配,“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 <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>

应该和更换前一样。

4

2 回答 2

86

Okay, try using this regex:

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

Example worked on regex101.

Breakdown:

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

The negative lookahead will prevent a match if text or simple is between html tags.

于 2013-09-04T19:51:00.787 回答
1
^([^<]*)<\w+.*/\w+>([^<]*)$

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

于 2013-09-04T18:56:10.490 回答