使用PHP DOMDocument区分XHTML和HTML的区别

3
我想用PHP DOM实现对HTML和XHTML文档的操作。我使用DOMDocument->loadHTML()方法来加载内容。
我想知道加载的内容是XHTML还是HTML。DOMDocument有一个doctype对象,其中包含文档本身的DOCTYPE声明。迄今为止,我考虑比较$dom->doctype->publicId,其中包含类似于“-//W3C//DTD HTML 4.01//ENtext/html”的字符串。
有没有更好的方法可以想到?
编辑:
抱歉我的问题可能有点不清楚。我更新了问题,因为它可能会令人困惑。但是现在要澄清的是:这个问题不是关于如何处理PHP DOM中的HTML或者XHTML是否好或坏的问题。

为什么不直接修复源文件,而要产生额外的服务器开销呢? - Demian Brecht
你所说的“修复”是什么意思?我从未说过它们有问题。源文件是用户提供的所有内容。因此,可能存在有效的DOCTYPE声明,也可能缺失。我只是好奇是否有其他或更好的方法来判断它是XHTML还是HTML,而不是使用DOMDocument->doctype。 - Alex Lawrence
相信如果您以HTML格式加载,那么应该以HTML格式保存。它应该保持原始文档类型声明。您可以使用DOM验证方法来确定文档是否基于其文档类型声明有效。如果无效,您应该让用户修复代码。 - dqhendricks
dqhendricks,你的评论一点也不有帮助。"pretty sure it you load as html, you should save as html" 在一般情况下可能听起来是正确的,但在 PHP DOM 的情况下并非如此。如果你想处理无效标记,你必须使用 loadHTML() 方法。我甚至没有问过验证的问题。而用户是否需要修复他的代码如果它无效完全超出了范围。这个决定是业务需求,而不是技术需求。 - Alex Lawrence
1个回答

1

如果你从外部源加载文件,你可以检查文件的 MIME 类型,并查看它是否为 application/xhtml+xml; 如果是,那么它肯定是 XHTML(当然它可能会说谎并用那种类型提供带有可怕的格式的标记)。否则,如果它是 text/html,那么它将被解析为 HTML 标记语言。实际标记的有效性除外,doctype 声明是告诉你内容是(或声称为)HTML 还是 XHTML 的下一个最佳方式。

就像你所说的那样,你可以检查公共标识符和/或 URI,并从中确定类型。


好的。所以我的XHTML测试现在是:“strpos(strtolower($ dom-> doctype-> publicId),'xhtml')!== false”。如果不是这种情况,那么我就认为它是HTML。你觉得呢? - Alex Lawrence
@Alex:听起来还不错,因为浏览器通常会将页面作为“text/html”接收,所以这是一个合理的假设。您可以使用stripos()而不是strpos(strtolower()) - BoltClock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接