2011-08-25 42 views

回答

4

我认为XPath是遍历类XML文档的主要选项。通过RegExp,您可以处理不同形式的书写标签(多行,双引号,单引号,无引号,一行,多行,内部数据,无内部数据等)。 )。使用XPath,这对你来说都是透明的,并且它有许多特性(例如通过索引访问节点,按属性值选择,选择simblings和许多其他功能)。

看看它可以在http://www.w3schools.com/xpath/有多强大。

编辑:参见How do HTML parses work if they're not using regexp?

3

如果Web开发人员做了任何细微的更改,XPath不太可能中断。那将是我的选择。

2

这是为什么你不应该用正则表达式解析HTML规范的解释#1:

RegEx match open tags except XHTML self-contained tags

一般情况下,你不能用正则表达式解析HTML,因为正则表达式不进行解析HTML。只需使用XPath。

+0

你写的所有内容,包括你的参考,都是错误的。 – tchrist

7

这一定程度上取决于你是否有未知的,但也形成内容与具有仅仅一个片段或完全清楚内容的HTML的一大片完整的HTML文件,该文件可能会或可能不完整。

编辑和解析有区别,你看。

这是一两件事要作为编辑,你自己写或以其他方式在脸上正确的盯着自己的HTML文件,并发出编辑命令

:100,200s!<br */>!!g 

从线200-300取下休息。

另一种方法是剔除HTML恰好位于URL的另一端,然后试着弄清楚它,看不见的东西。

实际上,第一个要求使用正则表达式解决方案 - 就像上面显示的那样。如果不想写一些大规模的过度工程的庞然大物去做一个秋天的分析来设置整个分析树来做简单的编辑,那简直是错误的。这也是它自己的惩罚。另一方面,使用模式解析出来(而不是抽出)一个完整的HTML文档,它可以包含你不打算用的各种怪异东西,只是为了利用别人的努力工作而大喊大叫。为自己重新创造轮子,并且在那个方面很糟糕。

然而,还有别的人不喜欢提及,这就是大多数人只是不能胜任正则表达式。他们并不真正了解他们。他们不知道如何测试或制作它们。他们不知道如何让他们可读和可维护。

事实的真相是绝大多数正则表达式用户甚至无法像使用正则表达式匹配任意HTML标记一样管理简单和基本的事情,即使是像备用编码和CDATA部分那样的问题,并重新定义了实体和<script>内容和古老的从未见过的形式都可以安全地放弃。

这不是因为它很难做到;实际上并非如此。只是,试图做到这一点的人既不理解正则表达式也不理解HTML,他们不知道知道他们不知道,所以他们会比他们意识到的更快。然后他们手上有一场完全的灾难。

加上它之前已经完成,并且正确。不妨从别人的错误中吸取教训,呃?这可能会有助于有几个罐头正则表达式可供您经常操纵的东西。这对编辑特别有用。

但是,对于完全解析,你真的不应该尝试在模式中嵌入完整的HTML语法。诚实,你真的不应该。说起某人其实可以并且有做到这一点,我不像99.9999%的响应者在这里提供实际经验的可信度,当时我反对它。当然,我可以做到,但我几乎从不想,我当然不希望你在家中无人监督地尝试。我不能对任何可能发生的损害承担责任。 :)

当然,这可能听起来像“按照我说的做,而不是我做的”,但是如果你的正确性级别达到了允许你考虑这样的事情的水平,那么你就不会问这个问题了题。正如我所提到的,几乎没有人使用正则表达式实际上可以匹配任意的HTML标签,就这么简单。鉴于你在编写递归下降语法之前需要这种构建块,并且由于没有人能够管理那个简单的构建块,所以...

鉴于这种可悲的状态,最好使用只适用于简单编辑作业的正则表达式,并将其用于更真实的正则表达式向导的完整解决方案,因为它们微妙而快速地产生愤怒。当然这意味着正则表达式,而不是(仅)巫师。

但肯定的是,保留一些罐头正则表达式,方便进行简单编辑而不是完全解析。这样你就不会被迫每次都从最初的原则来重新定义它们。我保留了其中的一些内容,但后来我还保留了简单的框架,这些框架允许我编辑HTML的特定结构元素,如纯文本或标记内容或链接引用等,并且这些内容全部使用完整解析器,然后让我以完全自信的方式手术瞄准我想要的部分我没有忘记一些东西。

更是证明了什么是可能比什么是可取的,你可以看到一些答案与更多的,嗯,“英雄”模式匹配,包括递归, hereherehereherehere ,和 here

明白这其中的一些为人们展示为什么他们应该使用正则表达式,因为他们中的一些确实很复杂,很多moreso比你可以在nonwizards预期的明确目的实际上写的。这种困难可能会把你赶走,这没关系,因为这是有意的。

但是,不要让它阻止你在HTML文件上使用vi,也不应该让你远离使用它的搜索或替换命令。不要让完美成为善的敌人。有时候,足够好的东西正是你需要的东西,因为完美的东西需要更多的投资。

了解几种可能的方法中的哪一种会给你带来最大的回报,这需要时间来学习,没有人能告诉你答案对你有用。他们不知道你的数据集,你的要求,你的技能,你的优先级。因此任何分类答案都是自动错误的。你必须为自己评估这些事情。

+0

发布这个答案后的半年时间,但我只是不得不说:这只是对HTML的解析和正则表达式的相互关联,我已经看到过!这也是最接近我自己对事情的看法。它不像另一个“着名”的答案那样被大肆渲染,但它是迄今为止最好的一个。 – thebodzio

+0

@thebodzio谢谢。这是真的,[某些答案](http://stackoverflow.com/questions/4231382/regular-expression-pattern-not-matching-anywhere-in-string/4234491#4234491)有更多的选票,但这次我试图用散文来说服,而不是用麻木的代码。我当然不会试图通过毫无意义的开玩笑来说服,因为这些部分似乎很平常。完全没用,那。 – tchrist

+0

我全心全意地认同“无聊的开玩笑” – thebodzio