为什么php DOM在机器之间区别对待?

时间:2014-10-13 09:56:49

标签: 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_dump吐出一个DOMText对象,但在我的生产机器上它返回了一个DOMElement对象。

生产服务器正在使用php 5.4.33

运行libxml 2.7.8

Dev机器正在使用php 5.4.4

运行libxml 2.8.0

1 个答案:

答案 0 :(得分:1)

它可能与不同的PHP版本有关: DOMDocument::loadHTML方法仅接受自PHP 5.4起的第二个($options)参数,它在the changelog上列出:

  

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

更改也列在on the DOMDocument::loadHTML doc pages

更新

经过一番挖掘,我发现了很多关于LIBXML_HTML_NODEFDTD常数的矛盾信息。根据文档,它在&gt; = libxml 2.7.7中可用,而其他来源与此相矛盾。我发现了一些手动定义此常量的项目,an answer here表示此常量仅在 中可用于libxml 2.7.8。
这可以解释您的2个环境之间的差异。 An open-source project on github只需要根据需要定义常量来解决这个问题:

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