我需要匹配所有这些开头标记:
<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标记的正则表达式:
<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>
它可能并不完美,但我通过大量HTML运行了这段代码。注意,它甚至会捕捉到一些奇怪的东西,比如出现在网络上的<a name=“badgenerator”“>。
我想,为了使其不匹配自包含的标签,您可能需要使用Kobi的负面外观:
<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+(?<!/\s*)>
或者如果没有,就合并。
对于下选民:这是从实际产品中工作的代码。我怀疑任何阅读此页面的人都会觉得在HTML上使用正则表达式是社会可以接受的。
注意:我应该注意,这个正则表达式在CDATA块、注释以及脚本和样式元素的存在下仍然会崩溃。好消息是,你可以去掉那些使用正则表达式的。。。
其他回答
如果您只是试图查找这些标记(没有解析的野心),请尝试以下正则表达式:
/<[^/]*?>/g
我在30秒内写下了它,并在这里进行了测试:http://gskinner.com/RegExr/
它匹配您提到的标记类型,而忽略您所说的要忽略的类型。
如果PHP需要此功能:
除非是正确格式化的XML,否则PHP DOM函数将无法正常工作。不管它们对人类其他人的用处有多大。
simplehtmldom很好,但我发现它有点bug,而且内存很重[会在大页面上崩溃。]
我从未使用过querypath,所以不能评论它的有用性。
另一个可以尝试的是我的DOMParser,它非常节省资源,我已经很高兴地使用了一段时间。简单易学,功能强大。
对于Python和Java,发布了类似的链接。
对于反对者,我只在XML解析器无法承受实际使用时才编写了我的课程。宗教上的反对投票只是阻止了有用的答案被发布——请把事情放在问题的角度之内。
尽管为此目的使用正则表达式并不合适和有效,但有时正则表达式为简单的匹配问题提供了快速解决方案,在我看来,将正则表达式用于琐碎的工作并不可怕。
有一篇关于匹配StevenLevithan编写的最内部HTML元素的权威博客文章。
OP似乎没有说他需要用标签做什么。例如,他需要提取内部文本,还是只检查标签?
我坚定地认为正则表达式不是万能的文本解析器。我已经编写了大量的文本解析代码,包括用于解析HTML标记的代码。
虽然我确实对正则表达式不太在行,但我认为正则表达式太死板,很难维护这种解析。
如果您只需要标记名,那么应该可以通过正则表达式执行此操作。
<([a-zA-Z]+)(?:[^>]*[^/] *)?>
应该做你需要的事。但我认为“莫里茨”的解决方案已经很好了。我一开始没看到。
对于所有反对者:在某些情况下,使用正则表达式是有意义的,因为这可能是最简单、最快捷的解决方案。我同意一般情况下不应该用正则表达式解析HTML。
但是当你有一个HTML子集,你知道格式并且你只想提取一些值时,正则表达式可以是一个非常强大的工具。我这样做了数百次,几乎总是达到我想要的目的。