其实
是无效的HTML,也不是有效的XML。
它不是有效的XML,因为'<' 和'>' 属性字符串中的有效字符不是。 它们需要使用相应的XML实体进行转义& lt; 和& gt;
它不是有效的HTML,因为HTML中不允许使用简短的结束表单(但在XML和XHTML中是正确的)。 根据HTML 4.01规范,'img'标记也是隐式封闭标记。 这意味着手动关闭它实际上是错误的,相当于两次关闭任何其他标签。
HTML中的正确版本是
XHTML和XML中的正确版本是
您提供的以下示例也无效
<
tag
attr="5"
/>
这也不是有效的HTML或XML。 标签的名称必须在'&lt;'后面,尽管属性和结束'&gt;' 可能在他们想要的任何地方。 所以有效的XML实际上就是这样
attr="5"
/>
这是另一个更有趣的一个:你实际上可以选择使用“或”作为你的属性引用字符
发布的所有其他原因都是正确的,但解析HTML的最大问题是人们通常无法正确理解所有语法规则。 您的浏览器将您的tagsoup解释为HTML这一事实并不意味着您实际上已经编写了有效的HTML。
编辑:甚至stackoverflow.com也同意我关于有效和无效的定义。 您的无效XML / HTML未突出显示,而我的更正版本是。
基本上,XML不能用regexp解析。 但也没有理由这样做。 每种语言都有许多XML解析器。 您可以选择SAX解析器,DOM解析器和Pull解析器。 所有这些都保证比使用正则表达式解析要快得多,然后您可以在生成的DOM树上使用XPath或XSLT等酷技术。
因此,我的回答是:不仅难以用正则表达式解析XML,而且这也是一个坏主意。 只需使用数百万个现有XML解析器中的一个,并利用XML的所有高级功能。
HTML甚至难以自己解析。 首先,法律语法有许多你可能不知道的微妙之处,其次,野外的HTML只是一堆巨大的(你得到我的漂移)。 有很多松散的解析器库可以很好地处理像标签汤这样的HTML,只需使用它们。