此行使我的网络主机上的页面崩溃,但在我的本地主机上却没有

This line crashes the page on my web host but not on my localhost

$title = $xpath->query("span[@class='item_list']",$item)[0];

我不明白为什么只有当我在我的虚拟主机上省略这一行时它才有效。 localhost 看起来正常且功能正常。这用于 Wordpress 4.9.4 中的模板。我不知道主机的 PHP 版本是什么。此行位于另一个 xpath 查询的循环内,如果上面的行被删除,该查询将与页面一起使用:

foreach( $xpath->query("//div[@class='product_list']") as $item) {    }

我的虚拟主机上的 php 中是否设置了限制,阻止我执行多个查询?或者嵌套查询?

解决了我的问题。当我在脚本上打开错误报告并向我展示这个时,罪魁祸首就出来了:

Fatal error: Cannot use object of type DOMNodeList as array

我参考了这个错误,了解到它是由我最初怀疑的本地主机和虚拟主机之间的不同 PHP 版本引起的。

节点列表不能被视为旧 PHP 版本(< 5.6.3)中的数组。

这里有几种方法可以避免这个问题。

使用->item()方法

$titleNode = $xpath->query("span[@class='item_list']",$item)->item(0);

在 Xpath 中使用限制

foreach ($xpath->query("span[@class='item_list'][1]",$item) as $titleNode) {
  //...
}

这将节点列表中的节点限制为第一个。如果 Xpath 表达式无法匹配某个节点,则 foreach() 可以针对第一个节点执行一次,也可以不执行。这是验证此处是否有要处理的标题节点的一个很好的快捷方式。

直接获取文本内容

$titleString = $xpath->evaluate("string(span[@class='item_list'])",$item);

Xpath 表达式可以 return 结果为标量变量(字符串、数字、布尔值)。这仅适用于 DOMxpath::evaluate()string() 将第一个匹配的节点转换为字符串(return 是它的文本内容)。如果没有匹配的节点,它 return 是一个空字符串。