我正在尝试创建一个Regex表达式来匹配HTML文档中的内容,但我希望排除标记本身中包含的匹配项。请考虑以下事项:
<p>Here is some sample text for my widgets</p>
<a href="http://mywidgets.nowhere">Click here to view my widgets</a>
我想匹配'小部件',以便我可以用不同的字符串替换它,比如'绿色框',而不用替换网址中的匹配。
匹配'小部件'很简单,但是我很难添加排除以检查'小部件'何时出现在开始和结束标记'&lt;&gt;'中。
我目前的工作方式:作为第一步,我开始匹配'&lt;&gt;'中包含的'小部件'。 (然后我可以继续将其作为后面的排除)但是下面的字符串似乎与整个文档匹配,即使我在结束时放置了一个排除&gt;确保小部件出现在标签内。
<.*[^>]widgets.*[^<]>+
这可能是懒惰/贪婪,但我不能完全解决它!
答案 0 :(得分:3)
没有意义这是一个很好的答案,因为它使用正则表达式解析HTML,但它确实适用于OP给出的测试用例。
有关详细信息,请参阅RegEx match open tags except XHTML self-contained tags 。
(?<!<[^>]*)widgets
(?<!<[^>]*)
否定的背后隐藏确保前面的内容不是<
后面跟>
以外的任何字符(任意次)widgets
按字面意思匹配答案 1 :(得分:0)
这可能部分有效:
(?:^|>)[^<]*widgets
这将从一行的开头(如果使用/m
标志)或标签的结尾(因此我们知道我们不在一个)开始查看,并提前尽可能多的字符不是&lt;,意味着在查找小部件之前无法打开另一个标记。
问题是,如果你有一个&gt;它可能会给出奇怪的结果。在标记内部(例如,在javascript中),或者如果单个标记可以跨越多行,并且它将在相同的子字符串中找不到“小部件”的多个实例。要解决这些问题,最好使用ctwheels