正则表达式不包括 HTML 标记中包含的匹配项



我正在尝试创建一个正则表达式来匹配HTML文档中的内容,但我希望排除标签本身中包含的匹配项。请考虑以下事项:

<p>Here is some sample text for my widgets</p>
<a href="http://mywidgets.nowhere">Click here to view my widgets</a>
我想匹配">

小部件",以便我可以用不同的字符串替换它,比如"绿色框",而无需替换 url 中的匹配项。

匹配"小部件

"就像任何事情一样容易,但是当"小部件"出现在开始和结束标签"<>"中时,我正在努力添加排除以检查"小部件"。

目前的工作:作为第一步,我已经开始匹配"<>"中包含的"小部件"。(然后我可以继续稍后将其排除(但是,下面的字符串似乎与整个文档匹配,即使我在结束>上放置了一个排除以确保小部件出现在标签中。

<.*[^>]widgets.*[^<]>+ 

这可能是懒惰/贪婪,但我无法完全解决!

概述

绝不是一个很好的答案,因为它使用正则表达式解析 HTML,但它确实适用于 OP 给出的测试用例。

请参阅正则表达式匹配开放标签,但 XHTML 自包含标签除外 了解更多信息。

<小时 />

法典

在此处查看正在使用的正则表达式

(?<!<[^>]*)widgets
<小时 />

解释

  • (?<!<[^>]*) 负回头看,确保前面的内容后面没有<>以外的任何字符(任意次数(
  • widgets 从字面上匹配

这可能部分有效:

(?:^|>)[^<]*widgets

这将从一行的开头(如果使用/m标志(或标签的结尾(所以我们知道我们不在一个标签中(开始查找,并尽可能多地前进未<字符,这意味着您无法打开另一个标签,然后再查找小部件。这样做的问题是,如果你在一个标签中有一个>(例如,在javascript中(,或者如果一个标签可以跨越多行,并且它不会在同一子字符串中找到"小部件"的多个实例,它可能会给出奇怪的结果。为了解决这些问题,您最好按照ctwheels的建议使用实际的XML解析器。

最新更新