试图在 php 中捕获 $xpath->evaluate

Posted

技术标签:

【中文标题】试图在 php 中捕获 $xpath->evaluate【英文标题】:Trying to catch $xpath->evaluate in php 【发布时间】:2018-10-28 04:23:03 【问题描述】:

我正在尝试捕捉当我的 $xpath->evaluate 找不到匹配对象时发生的尝试获取非对象属性通知。

这是我的代码

$doc = new DOMDocument();
$doc->loadhtml($html);
$xpath = new DOMXPath($doc);
$sources = $xpath->evaluate("//img/@src"); # "/images/image.jpg"
$src = $sources[0]->value;
echo $src;

我已经尝试将$sources = $xpath->evaluate("//img/@src"); 放入try and catch 语句中,但由于它不是异常错误,所以它不起作用。

我也尝试过使用

if ($sources) 
  $src = $sources[0]->value;
  echo $src;

这也没有用。

你知道我可以做什么来收到通知吗?

【问题讨论】:

php - How to catch a 'Trying to get property of non-object' error的可能重复 @ficuscr 我已经尝试过这篇文章中的解决方案,但没有奏效。 嗨,“没用”?不知道你的意思是什么。我分享的答案我认为很清楚。你无法捕捉到错误。你只能捕获一个异常。 @ficuscr 我的意思是你分享的答案并没有解决我的问题。 ^^ 【参考方案1】:

您可以检查是否返回了某些内容以及返回的节点数...

if ($sources !== false && $sources->length > 0) 
  $src = $sources[0]->value;
  echo $src;

evaluate()可能会返回一个DOMNodeList,所以上面的代码检查length

【讨论】:

我确实得到了未定义的属性:DOMNodeList::$count Returns a typed result if possible or a DOMNodeList containing all nodes...,仅在错误时为 false。检查!== false 是否理想?我会更明确。 我确实需要添加一个自己的 count() 函数对吗?因为我得到未捕获的错误:调用未定义的方法 DOMNodeList::count() 尝试使用length(来自php.net/manual/en/class.domnodelist.php)的替代方法 @ficuscr,如果你做了类似evaluate("count(//img/@src)") 他们没有做的事情,evaluate 只返回一个类型化的结果,false 只返回'如果表达式格式错误或 contextnode 无效'。 【参考方案2】:

您必须使用结果的length 属性,其中包含计数。

if ($sources->length > 0) 
    $src = $sources[0]->value;
    echo $src;

除此之外:您只能捕获异常。警告和错误也不例外。如果要捕获它们,则必须注册自己的错误处理程序,然后引发异常。在您的情况下,这也是可能的,但它始终是完全避免此类错误的更好解决方案。

【讨论】:

以上是关于试图在 php 中捕获 $xpath->evaluate的主要内容,如果未能解决你的问题,请参考以下文章

PHP SimpleXMLElement xpath

在有效的 PHP query() XPath 中转换 Javascript XPath |规范化 JS XPath --> PHP

使用 xpath 选择值中带有破折号的属性

我怎样才能得到这个 Xpath

使用 DOMDocument PHP 获取 Xpath 父节点?

PHP for 循环不适用于 jQuery API(未捕获的 TypeError)