2011-01-05 88 views
3

我想用PHP DOM实现来操纵HTML和XHTML文档。我使用DOMDocument-> loadHTML()方法来加载内容。用PHP DOMDocument区分XHTML和HTML

想知道加载的内容是XHTML还是HTML。 DOMDocument有一个doctype对象,它包含文档本身的DOCTYPE声明。到目前为止,我想过比较包含像“ - // W3C // DTD HTML 4.01 // ENtext/html”的$ dom-> doctype-> publicId

有任何人可以想到更好的方法吗?

编辑:

很抱歉,如果我的问题有点不清楚。我更新了这个问题,因为它可能令人困惑。但现在要说清楚:这个问题不是关于一般处理HTML DOM与HTML DOM,还是XHTML是好还是坏。

+0

为什么不修复源文档而不是额外增加服务器开销? – 2011-01-05 23:16:59

+0

你是什么意思?我从来没有说过他们坏了。源文档是用户提供的所有内容。所以可能会有一个有效的DOCTYPE声明。它也可能会丢失。其实我只是好奇,如果有人知道另一种或更好的方式来说,如果它是XHTML或HTML比使用DOMDocument-> doctype。 – 2011-01-05 23:21:18

+0

很确定你加载为html,你应该保存为html。它应该保持原始文档类型声明。您可以使用DOM验证方法根据文档类型声明确定文档是否有效。如果该代码无效,您应该让用户修复代码。 – dqhendricks 2011-01-06 01:52:03

回答

1

如果您从外部来源加载,您可以检查文件的MIME类型,看看它是否是application/xhtml+xml;如果是的话,那肯定是XHTML(当然它可以说谎并且可以用这种类型服务,但是可怕的格式不正确)。否则,如果它是text/html那么它将被解析为HTML标签汤。除了,实际标记的有效性,doctype声明是判断内容是否为HTML或XHTML的下一个最佳方式。

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

+0

好的。所以我现在对XHTML的测试是:“strpos(strtolower($ dom-> doctype-> publicId),'xhtml')!== false”。如果情况并非如此,那么我认为它是HTML。你怎么看? – 2011-01-06 12:14:10

+0

@Alex:这听起来没问题,因为浏览器通常会以“text/html”方式接收页面,所以这是一个合理的假设。你可以使用'stripos()'而不是'strpos(strtolower())'。 – BoltClock 2011-01-06 12:16:37

+0

很酷。谢谢 :) – 2011-01-06 12:20:43