阅读这个有趣的咆哮(RegEx match open tags except XHTML self-contained tags)我想知道......如何更改正则表达式以成功解析HTML?
我在这里寻求以下建议:
有没有人真的做过这样的事情?
答案 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。