【问题标题】:XPath find if an attributes value is in a array listXPath 查找属性值是否在数组列表中
【发布时间】:2020-06-27 12:29:38
【问题描述】:

我想用 xpatch 选择所有具有 href 属性的 <a> 标记等于包含 url 列表的数组中的值。

虽然我在 stackoverflow 上找到了很多示例,但它们都返回了这个错误:<b> Warning </b>: DOMXPath :: query (): Invalid expression in...

这是我测试但没有成功的代码:

$xpath->query("//a[@href=('facebook.com', 'google.com', 'amazon.com')]");

如果尝试使用一个值正常工作,如下所示:

$xpath->query("//a[@href=('facebook.com')]");

但如果我尝试添加多值返回提到的错误,我有一个包含大约 1000 个 URL 的数组,我想选择我的数组中存在 href 属性值的所有链接。

这是用 xpatch 加载 DOMDocument 加载的 DOM 的代码

$dom = new DOMDocument( '1.0', 'utf-8' );
         
$xpath = new DomXpath($dom);

我想澄清一下,执行速度对我来说很重要。 在您看来,选择所有链接然后通过带有 in_array 的 foreach 循环进行检查站外 xpatch 更快还是将条件直接插入 xpatch 更快?

【问题讨论】:

  • stackoverflow.com/questions/3025885/… 展示了如何在 1 个 XPath 表达式中执行此操作,但是对于这么多 URL,您最好检索所有 href 值,然后在循环中检查它们。
  • 我已经看过您指出的页面,我的示例与有关 xpatch 2.0 的答案相同,您参考哪个示例。我想指出执行速度对我来说很重要,那么您认为单独的循环比直接使用 xpatch 的条件快还是慢?

标签: php html xml xpath domxpath


【解决方案1】:

针对值列表进行测试需要 XPath 2.0,但 PHP DOMXPathonly supports XPath 1.0。因此,您不能使用

//a[@href=('facebook.com', 'google.com', 'amazon.com')]

改为使用

//a[@href='facebook.com' or @href='google.com' or @href='amazon.com']

相对于其他替代方案的执行速度,例如使用 XPath 获取所有 a 元素并在宿主语言中迭代以过滤感兴趣的元素,请遵循性能评估的通用规则:衡量,不要猜(或者让别人帮你猜)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 2011-10-17
    • 2017-03-01
    • 2022-01-15
    • 1970-01-01
    • 2023-03-11
    • 2016-10-02
    相关资源
    最近更新 更多