html - 能否提供了一些示例,为什么正规表达式解析XML和html很难?

  显示原文与译文双语对照的内容

上有一个错误,我看见人们制作 )一遍又一遍正在尝试解析XML或者 HTML 下面是解析XML和HTML的一些原因:

人们希望将文件视为一系列行,但这是有效的:


<tag
attr="5"
/>

人们想要将 <或者 <标记作为标记的开始,但类似于这样的东西在野外存在:


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

人们经常想匹配开始标记到结束标记,但是XML和HTML允许标记包含自己的( 传统正则表达式根本不能处理):


<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>

你还知道哪些其他的陷阱?

时间:

下面是一些有趣的有效 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>

更不用说对无效构造的所有browser-specific解析。

祝 正规表达式 pitting that !


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

实际实际


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

无效的HTML,也不是有效的XML 。

无效的XML,因为'<'和'>'不是属性字符串中的有效字符。 需要使用相应的XML实体 & lt和 & 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 同意关于有效和无效的定义。 你的无效 xml/html没有突出显示,而我更正的版本是。

基本上,没有用regexp来解析 XML 。 但也没有理由这么做。 每种语言都有很多的XML解析器。 你可以在SAX解析器,DOM解析器和Pull解析器之间选择。 所有这些都保证要比使用正则表达式更快地进行分析,然后你可以在结果DOM树上使用像XPath或者XSLT这样的很酷的技术。

因此我的回答是:不仅用regexp解析 XML,而且也是一个不好的主意。 只需使用数百万现有的XML解析器之一,并利用XML的所有高级特性。

HTML是很难解析自己的。 第一个合法的语法有许多小的,和第二,HTML在野生环境的一些微妙之处,你可能没有意识到只是一个巨大的( 你得到我的漂移) stinking桩。 有各种各样的lax解析器库,在处理像标签汤这样的HTML时很好,只需使用这些。

我相信这个的经典拥有你想要的信息。 你可以在其中一个评论中找到要点:

我认为这里的缺陷是HTML是一个乔姆斯基类型 2语法( 上下文无关语法) 和 正规表达式 是一个乔姆斯基类型 3语法( 正则表达式) 。 3语法- 你不能因为一个类型 2文法是从根本上变得比一个类型可能是希望能让这些工作 。 但很多人会尝试,有些会声称成功,其他人会发现错误并完全搞乱你。

来自维基百科的更多信息: 乔姆斯基层次结构

...