-2

可能重复:
正则表达式匹配打开的标签,XHTML 自包含标签除外

我有一个像这样的html字符串

<html>
  <div>
      <p>this is sample content</p>
  </div>
  <div>
      <p>this is another sample</p>
      <span class="test">this sample should not caught</span>
      <div>
       this is another sample
      </div>
  </div>
</html>

现在我想sample从这个字符串中搜索单词,这里我不应该得到里面的“样本”<span>...</span>

我希望使用正则表达式完成此操作,我尝试了很多但我做不到,任何帮助都非常有用。

提前致谢。

4

1 回答 1

4

span如果可以有嵌套标签,这非常脆弱并且失败。如果您没有这些,请尝试

(?s)sample(?!(?:(?!</?span).)*</span>)

sample仅当下一个span标签(如果有)不是结束标签时才匹配。

解释:

(?s)          # Switch on dot-matches-all mode
sample        # Match "sample".
(?!           # only if it's not followed by the following regex:
 (?:          #  Match...
  (?!</?span) #   (unless we're at the start of a span tag)
  .           #   any character
 )*           #  any number of times.
 </span>      #  Match a closing span tag.
)             # End of lookahead

sample仅当它既不在 aspan也不在 a 内时才匹配p,您可以使用

(?s)sample(?!(?:(?!</?span).)*</span>)(?!(?:(?!</?p).)*</p>)

但是所有这一切都完全取决于标签被取消嵌套(即,没有两个相同类型的标签可以嵌套)和正确平衡(通常没有p标签给出)。

于 2012-09-21T09:34:52.793 回答