【问题标题】:Trying to catch $xpath->evaluate in php试图在 php 中捕获 $xpath->evaluate
【发布时间】: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;
}

这也没有用。

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

【问题讨论】:

  • @ficuscr 我已经尝试过这篇文章中的解决方案,但没有奏效。
  • 嗨,“没用”?不知道你的意思是什么。我分享的答案我认为很清楚。你无法捕捉到错误。你只能捕获一个异常。
  • @ficuscr 我的意思是你分享的答案并没有解决我的问题。 ^^

标签: php html regex dom try-catch


【解决方案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;
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 2011-03-21
    • 2015-09-25
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    相关资源
    最近更新 更多