我需要匹配所有这些开头标记:
<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一次或多次,然后找到零个或多个空格,然后查找任何字符零次或多次,贪婪,除了/,然后查找大于
我有这个权利吗?更重要的是,你怎么看?
当前回答
您希望第一个>前面不带/。请查看此处了解如何执行此操作的详细信息。这被称为消极的后顾。
然而,在这个示例文档中,这一天真的实现最终将与<bar/></foo>匹配
<foo><bar/></foo>
你能提供更多关于你试图解决的问题的信息吗?您是否以编程方式遍历标签?
其他回答
中国古代军事家、将军和哲学家孙子说过:
据说,如果你了解你的敌人,了解你自己,你可以赢得百战百胜,而不会一败涂地。如果你只了解自己,而不了解对手,你可能会赢,也可能会输。如果你既不了解你自己也不了解你的敌人,你将永远危及自己。
在这种情况下,你的敌人是HTML,你要么是你自己,要么是正则表达式。您甚至可能是带有不规则正则表达式的Perl。了解HTML。了解自己。
我写了一首描述HTML本质的俳句。
HTML has
complexity exceeding
regular language.
我还写了一首俳句,描述Perl中正则表达式的性质。
The regex you seek
is defined within the phrase
<([a-zA-Z]+)(?:[^>]*[^/]*)?>
OP似乎没有说他需要用标签做什么。例如,他需要提取内部文本,还是只检查标签?
我坚定地认为正则表达式不是万能的文本解析器。我已经编写了大量的文本解析代码,包括用于解析HTML标记的代码。
虽然我确实对正则表达式不太在行,但我认为正则表达式太死板,很难维护这种解析。
<\s*(\w+)[^/>]*>
各部分解释如下:
<:起始字符
\s*:标签名称前可能有空格(难看,但可能)。
(\w+):标记可以包含字母和数字(h1)。嗯,w也与“_”匹配,但我想它不会伤害你。如果好奇,请改用([a-zA-Z0-9]+)。
[^/>]*:除了>和/直到关闭>
>:关闭>
不相关的
对于那些低估了正则表达式的人来说,他们说正则表达式的功能和正则语言一样强大:
anbanban不是规则的,甚至不是上下文无关的,可以与^(a+)b\1b\1匹配$
反向引用FTW!
Try:
<([^\s]+)(\s[^>]*?)?(?<!/)>
它与您的类似,但最后一个>不能在斜杠之后,也接受h1。
如果PHP需要此功能:
除非是正确格式化的XML,否则PHP DOM函数将无法正常工作。不管它们对人类其他人的用处有多大。
simplehtmldom很好,但我发现它有点bug,而且内存很重[会在大页面上崩溃。]
我从未使用过querypath,所以不能评论它的有用性。
另一个可以尝试的是我的DOMParser,它非常节省资源,我已经很高兴地使用了一段时间。简单易学,功能强大。
对于Python和Java,发布了类似的链接。
对于反对者,我只在XML解析器无法承受实际使用时才编写了我的课程。宗教上的反对投票只是阻止了有用的答案被发布——请把事情放在问题的角度之内。