我需要匹配所有这些开头标记:
<p>
<a href="foo">
但不是这些:
<br />
<hr class="foo" />
我想出了这个,想确保我做得对。我只是在捕捉a-z。
<([a-z]+) *[^/]*?>
我相信上面写着:
找到一个小于,然后查找(并捕获)a-z一次或多次,然后找到零个或多个空格,然后查找任何字符零次或多次,贪婪,除了/,然后查找大于
我有这个权利吗?更重要的是,你怎么看?
我需要匹配所有这些开头标记:
<p>
<a href="foo">
但不是这些:
<br />
<hr class="foo" />
我想出了这个,想确保我做得对。我只是在捕捉a-z。
<([a-z]+) *[^/]*?>
我相信上面写着:
找到一个小于,然后查找(并捕获)a-z一次或多次,然后找到零个或多个空格,然后查找任何字符零次或多次,贪婪,除了/,然后查找大于
我有这个权利吗?更重要的是,你怎么看?
当前回答
我认为这里的缺陷是HTML是Chomsky Type 2语法(上下文无关语法),正则表达式是ChomskyType 3语法(正则语法)。由于第2类语法从根本上比第3类语法更复杂(请参见乔姆斯基层次结构),因此不可能实现这一点。
但很多人会尝试,有些人甚至会声称成功,但直到其他人发现错误并将你彻底搞砸。
其他回答
我以前使用过一个名为HTMLParser的开源工具。它被设计为以各种方式解析HTML,并且很好地达到了目的。它可以将HTML解析为不同的树节点,您可以轻松地使用它的API从节点中获取属性。看看它,看看这对你有没有帮助。
每当我需要从HTML文档中快速提取内容时,我都会使用Tidy将其转换为XML,然后使用XPath或XSLT来获取所需内容。在您的案例中,类似于:
//p/a[@href='foo']
您希望第一个>前面不带/。请查看此处了解如何执行此操作的详细信息。这被称为消极的后顾。
然而,在这个示例文档中,这一天真的实现最终将与<bar/></foo>匹配
<foo><bar/></foo>
你能提供更多关于你试图解决的问题的信息吗?您是否以编程方式遍历标签?
Try:
<([^\s]+)(\s[^>]*?)?(?<!/)>
它与您的类似,但最后一个>不能在斜杠之后,也接受h1。
<([a-z][^>\s]*)(?:\s+[^>]+)?>
此正则表达式将匹配由单个单词(例如<p>、<a>等)组成的开头标记,后跟零个或多个空格和任意数量的字符(除了>或空白),然后是结束>字符。它还会将标记与属性匹配,并且不会将标记与包含a-z以外字符的名称匹配。然而,它仍然不会匹配自动关闭标签。