看的人做出一个错误转移重新尝试使用正则表达式解析 XML 或 HTML。下面是几个解析 XML 和 HTML 是硬的原因︰

人们想要将文件视为一系列的行,但这是有效的︰

<tag
attr="5"
/>

人们想要将 < 或 < 为标记的开始标记,但像这样处于放任状态存在的材料︰

<img src="imgtag.gif" alt="<img>" />

人们通常想要匹配的开始标记与结束标记,但是 XML 和 HTML 允许标记包含本身 (它不能在所有处理传统 regexes)︰

<span id="outer"><span id="inner">foo</span></span>

人们通常想要匹配的内容的文档 (比如著名"查找给定页面上的所有电话号码"问题),但数据可能已被标 (即使它看起来正常查看时)︰

<span class="phonenum">(<span class="area code">703</span>)
<span class="prefix">348</span>-<span class="linenum">3020</span></span>

注释可以包含差格式或不完整的标记︰

<a href="foo">foo</a>
<!-- FIXME:
    <a href="
-->
<a href="bar">bar</a>

什么其他问题是否了解?

2009-03-31 14:13:39
问题评论:

Web 浏览器这种乱七八糟数以百万计的第二次的有意义,不能有人创建 web 页分析器类对于我们而言无论是无名小卒?

吴建中,他们有。在 Perl 中有很多的 HTML::Parser、 HTML::TreeBuilder,等等。有几乎可以肯定是一个用于您的语言。

最好的回答是, stackoverflow.com/a/1732454/135078 (注意 Zalgo)

为什么没有合理的解释 [无法解析 [X] HTML 与正则表达式] [1] [1]: stackoverflow.com/a/1732454/468725

这里有合理的解释,当然可以您如何分析与模式的 HTML 的以及为什么您可能不希望这样做。

回答:

以下是一些有趣的有效的 XML:

<!DOCTYPE x [ <!ENTITY y "a]>b"> ]>
<x>
    <a b="&y;>" />
    <![CDATA[[a>b <a>b <a]]>
    <?x <a> <!-- <b> ?> c --> d
</x>

和这种小捆绑的欢乐是有效的 HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" [
    <!ENTITY % e "href='hello'">
    <!ENTITY e "<a %e;>">
]>
    <title>x</TITLE>
</head>
    <p id  =  a:b center>
    <span / hello </span>
    &amp<br left>
    <!---- >t<!---> < -->
    &e link </a>
</body>

并不是说所有的浏览器特定分析无效的构造。

针对此坑 regex 的祝你好运 !

编辑 (Jörg W Mittag): 这是很好的另一条格式正确的、 有效的 HTML 4.01:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd"> 
<HTML/
  <HEAD/
    <TITLE/>/
    <P/>

其中一个 XML?有几个不同构造,即麻烦吗?DTD 内部子集吗?它定义一个新和实体;名为 y,包含] > 序列,如果不在引号中,正常情况下,将结束内部子集。

(这说明必须要有很深了解的一些更复杂、 更陈旧 DTD 功能的 XML 的文档进行分析正确,即使您不是一个 DTD 验证分析器。)

和人然后 bitch 有关被过分严格的 XHTML。Damn 您的话,我想我要 Nazi 严格的 XHTML !我想如果没有一个失败的所有浏览器缺少空间 !然后我们将讨论分析.

使 HTML 示例使用很少的已知功能︰ shorttags。w3.org/QA/2007/10/shorttags.html的阅读更多

每次有人写 HTML Tim Berners-Lee 上面所示摆脱了单一的破损。

实际上

<img src="imgtag.gif" alt="<img>" />

是无效的 HTML,并且也是无效的 XML。

是无效的 XML 因为 < 和 > 是无效的属性字符串中的字符。他们需要进行转义,使用相应的 XML 实体 & l t;和 & gt;

这无效 HTML 可能是因为短关闭窗体不允许 HTML 中 (但在 XML 和 XHTML 正确无误)。Img 标记也是按照 HTML 4.01 规范隐式封闭的标记。也就是说,手动关闭它实际上是错误的并且相当于两次关闭任何其他标记。

在 HTML 中的正确版本

<img src="imgtag.gif" alt="&lt;img&gt;">

并且在 XHTML 和 XML 的正确版本

<img src="imgtag.gif" alt="&lt;img&gt;"/>

下面的示例为指定也无效

<
tag
attr="5"
/>

这也是无效的 HTML 或 XML。标记的名称必须是右背后 <,尽管属性和右 > 可能是他们希望的任何地方。所以实际上是有效的 XML

<tag
attr="5"
/>

这就是另一个 funkier 一︰ 实际上可以选择使用两种"或作为转义字符属性

<img src="image.gif" alt='This is single quoted AND valid!'>

已发布的所有其他原因是正确的但分析 HTML 的最大问题是,人们通常不了解所有的语法规则正确。您的浏览器解释您的 tagsoup,如 HTML 并不意味着实际编写有效的 HTML。

编辑︰ 并甚至 stackoverflow.com 同意我关于有效和无效的定义。每个 HTML 无效的 XML 不突出显示,而我的修正的版本。

从根本上说,XML 不是与 regexps 一起进行分析。但也没有理由这样做。有很多、 很多 XML 分析程序为每个语言。您可以选择 SAX 分析器、 DOM 分析器和拉分析器之间。保证所有的这些都是比分析与 regexp 快得多,便可以使用 XPath 或 XSLT 等时髦的技术上所得到的 DOM 树。

因此,我的答复是︰ 不只分析 XML 与 regexps 硬盘,但它也是个好主意。只需使用一个现有的 XML 分析器,数以百万计,并充分利用 XML 的所有高级功能。

HTML 是太难甚至尝试分析自己。第一次合法的语法有很多小的细微部分,您可能不知道的和第二,大范围爆发的 HTML 是只巨大的人讨厌之中的 (您得到我偏移)。有各种宽松的解析器库在处理 HTML 标记浓汤像很好,只需使用这些。

不需要转义 > 作为 > 也是如此。

好,s/有效/中存在大范围爆发 g

实际上,根据规范必须转义 > 作为 > 一样必须转义 < 为 < & 和 & amp;在属性,并"为 & q u o t;和作为 & a p o s;只是很多解析器

规范的不是 ' >' 必须转义 — 序列的特殊情况除外]] > 内容中。因此最好始终转义 ' >',但规范不要求这样做。

>符号是完全有效的 html stackoverflow.com/questions/94528/...

我在这个主题上编写整项︰正则表达式限制

问题的关键是,HTML 和 XML 需要盘点机制以便正确分析的递归结构。真实的正则表达式不能计数。为了计算必须上下文无关的语法。

前一段带有轻微的警告。现在,某些正则表达式实现支持递归的思想。但是一旦开始添加到正则表达式表达式递归过程时,您实际上拉伸边界,应考虑一个分析器。

不在您的列表上的一个隐患是属性可以任意顺序出现,因此,如果您的正则表达式寻找带有 href"foo"的链接和类"栏",他们可以以任何顺序出现并有任意数量的其他事情它们之间。

噢,是的这是甚至提示我提出此一 (第一个链接) 的问题。

这取决于您通过"分析"的意思。通常情况下,不能使用正则表达式,因为 XML 语法并不意味着常规分析 XML。简单地说,regexes 不能计数 (嗯,Perl regexes 完全可以进行计数的事情) 因此无法平衡打开关闭的标签。

我猜测反向引用可以解决问题的打开和关闭标记

@RishulMatta︰ 如何?有有限的数量的反向引用,您需要取消标记的笔记...而且 regexes 的严格定义不允许反向引用。

请输入您的翻译

Can you provide some examples of why it is hard to parse XML and HTML with a regex?

确认取消