为什么php DOM在不同的机器上处理元素的方式不同?

为什么php DOM在不同的机器上处理元素的方式不同?,php,domdocument,Php,Domdocument,使用此代码: <?php $s = '<h1>Header</h1>'; $dom = new DOMDocument(); $dom->loadHTML($s, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); var_dump($dom->documentElement->childNodes->item(0)); ?> 在我的开发机器上,var\u

使用此代码:

<?php
    $s = '<h1>Header</h1>';
    $dom = new DOMDocument();
    $dom->loadHTML($s, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
    var_dump($dom->documentElement->childNodes->item(0));
?>

在我的开发机器上,
var\u dump
吐出一个
DOMText
对象,但在我的生产机器上它返回一个
DOMElement
对象

生产服务器正在使用
libxml 2.7.8运行
php5.4.33


Dev machine正在运行
php5.4.4
libxml 2.8.0
可能与不同的php版本有关: 自PHP5.4以来,
DOMDocument::loadHTML
方法只接受了第二个(
$options
)参数,它列在:

5.4.0 DOMDocument::loadHTML添加了选项参数。
DOMDocument::loadHTMLFile添加了选项参数

还列出了这些更改

更新:

经过一些挖掘,我发现了很多关于
LIBXML\u HTML\u NODEFDTD
常量的矛盾信息。根据文档,它在>=libxml 2.7.7中可用,而其他来源与此相反。我发现一些项目手动定义了这个常量,并且声明这个常量只在libxml 2.7.8中可用。
这可以解释两种环境之间的差异。如果需要,只需定义常量即可解决此问题:

defined('LIBXML_HTML_NODEFDTD') || define ('LIBXML_HTML_NODEFDTD', 4);

这两台机器上是否安装了相同版本的libxml和php?否,我将在问题中添加这些版本。抱歉-在我的问题中添加了这些版本,这两台机器都在运行php 5.4。不过,您是对的,因为我的服务器上的saveHTML()会显示
标题
,所以它显然忽略了选项参数…@danbroooks:我现在正在浏览几个bug报告和libxml变更日志。有人报告说你似乎遇到了类似的行为。。。使用XPath是ATM的常见解决方法,though@danbroooks:在快速的谷歌会议后添加了一些发现谢谢你为我做了一些挖掘!然而,定义常量似乎没有多大作用,查看机器之间常量的值表明它们都具有相同的值(4&8192)。