猿问

除了XHTML自包含标记之外,RegEx匹配开放标记

我需要匹配所有这些开始标记:

<p><a href="foo">

但不是这些:

<br /><hr class="foo" />

我想出了这个,并希望确保我做对了。我只抓住了a-z

<([a-z]+) *[^/]*?>

我相信它说:

  • 找一个小于,然后

  • 然后,查找(并捕获)az一次或多次

  • 然后找到零个或多个空格

  • 找到任何字符零次或多次,贪婪/,然后

  • 找到一个大于

我有这个权利吗?更重要的是,你怎么看?


米琪卡哇伊
浏览 839回答 10
10回答

宝慕林4294392

虽然确实要求正则表达式解析任意&nbsp;HTML就像要求初学者编写操作系统一样,但有时候解析一组有限的已知&nbsp;HTML&nbsp;也是合适的。如果您有一小组HTML页面要从中抓取数据然后填充到数据库中,则正则表达式可能正常工作。例如,我最近想获得澳大利亚联邦代表的名称,政党和地区,我从议会的网站上获取了这些名称,政党和地区。这是一项有限的一次性工作。正则表达式对我来说效果很好,设置速度非常快。

摇曳的蔷薇

我认为这里的缺陷是HTML是Chomsky Type 2语法(无上下文语法),RegEx是Chomsky Type 3语法(常规语法)。由于Type 2语法从根本上比Type 3语法更复杂(参见Chomsky层次结构),因此在数学上不可能使用RegEx解析XML。但许多人会尝试,有些人甚至会声称成功 - 但直到其他人发现错误并完全搞砸了你。

守候你守候我

不要听这些家伙。如果你将任务分解成更小的部分,你完全可以使用正则表达式解析无上下文的语法。您可以使用脚本生成正确的模式,该脚本按顺序执行以下每个操作:解决停机问题。方圆。计算O(log n)或更少的旅行商问题。如果它不止于此,你将耗尽RAM并且引擎将挂起。模式将非常大,因此请确保您有一个无损压缩随机数据的算法。几乎就在那里 - 将整个事物除以零。十分简单。我自己还没完成最后一部分,但我知道我已经接近了。CthulhuRlyehWgahnaglFhtagnException由于某种原因,它一直在抛出s,所以我要将它移植到VB 6并使用On Error Resume Next。一旦我调查刚刚在墙上打开的这扇奇怪的门,我就会用代码更新。嗯。PS Pierre de Fermat也想出了如何做到这一点,但他写的边距不足以代码。

米脂

这是我使用(!)匹配HTML标记的正则表达式:<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>它可能不完美,但我通过大量&nbsp;HTML&nbsp;运行此代码。请注意,它甚至会捕获<a name="badgenerator"">出现在网络上的奇怪内容。我想让它与自包含的标签不匹配,你要么想要使用Kobi的负面后卫:<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+(?<!/\s*)>或者只是组合,如果没有。对于downvoters:这是来自实际产品的工作代码。我怀疑读这个页面的人会得到这样的印象:在HTML上使用正则表达式是社会可接受的。警告:我应该注意,在CDATA块,注释,脚本和样式元素存在的情况下,这个正则表达式仍然存在故障。好消息是,你可以摆脱使用正则表达式的人...

牧羊人nacy

我建议使用QueryPath在PHP中解析XML和HTML。它与jQuery的语法基本相同,只是在服务器端。
随时随地看视频慕课网APP
我要回答