为什么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)。