将正则表达式发展为可以解析HTML的东西需要什么?

时间:2011-02-07 15:03:13

标签: html regex

阅读这个有趣的咆哮(RegEx match open tags except XHTML self-contained tags)我想知道......如何更改正则表达式以成功解析HTML?

我在这里寻求以下建议:

  1. 正如我们所知,对正则表达式做了最小的补充并且喜欢它们(即不要“让它们看起来像XSLT!”类型的答案)
  2. 足够强大,可以正常工作。
  3. 建议语法(不只是列出一般要求)
  4. 有没有人真的做过这样的事情?

5 个答案:

答案 0 :(得分:2)

添加新的转义序列:

  • \H - 匹配HTML文档

答案 1 :(得分:1)

DOM / XML解析器在内部使用正则表达式来解析html。它们与仅使用正则表达式之间的区别在于弥补正则表达式的缺点。正则表达式的一个主要缺点是处理嵌套标记和格式错误的代码(如缺少标记)。因此,围绕基本正则表达式,编写了各种算法和条件来尝试处理这些事情。然后当然有部分实际上是从它创建一个对象。

所以你问过如何使正则表达式完成DOM / XML解析器的工作?您必须以某种方式将所有这些算法和条件塞进到正则表达式引擎中,在内部和模式语法中。

我个人不希望发生这种情况。 IMO正则表达式应该是直接模式匹配。 IMO已经有一些东西,其中IMO是值得怀疑的(例如,一些正则表达式确实有一种方法可以使用条件)。使用正则表达式引擎,然后围绕它构建一个更大的工具(如DOM / XML解析器)IMO是最好的方法。

答案 2 :(得分:0)

有趣的是,现实世界的工具可以并且经常被修改以执行他们可能不适合的任务。例如,如果有人试图用叉子吃肉汤,那么他们很可能会失败。进入spork。

我认为程序员不一定总是以这种方式工作。工具扩展其范围的情况并不少见,但程序员尝试将特定工具用于特定目的也是一个悠久的传统。

现在,恰好为了使正则表达式能够解析HTML,它必须是一个模式匹配器/识别器,它也能记住状态。对于T来说,这正是解析器的作用。它使用模式匹配(实际上,它经常使用正则表达式!)以匹配标记。然后它会记住令牌的组合。

事实上,正常使用正则表达式解析HTML,以及其他函数,这些函数记住了仅使用正则表达式无法描述或处理的较大模式。

希望回答这个问题。

答案 3 :(得分:0)

Perl 6有一个正则表达式扩展,旨在实现这一目的:http://en.wikipedia.org/wiki/Perl_6_rules

答案 4 :(得分:0)

取决于你所说的“解析”。通常,这涉及将字符流转换为对象树。要使用正则表达式执行此操作,您需要将捕获组完全更改为运行时变量多节点树,而不是它们当前所在的编译时固定数组。一旦你完成了,你刚刚重写了lex / yacc。