28

私はこの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一致させたい単語です (この場合は「単純」)
  • 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

さて、この正規表現を使ってみてください:

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

textまたはsimpleが html タグの間にある場合、否定先読みは一致を防ぎます。

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

しかし、これは非常にナイーブな表現です。DOM パーサーを使用することをお勧めします。

于 2013-09-04T18:56:10.490 に答える