PHP Xpath:获取包含指定词语的所有href值

21

在使用 PHP Xpath 时,我尝试快速获取 html 页面中的某些链接。

以下代码将查找 mypage.html 上所有 href 链接: $nodes = $x->query("//a[@href]");

而以下代码将查找 href 链接的 描述 包含我的关键字的所有链接: $nodes = $x->query("//a[contains(@href,'click me')]");

我想要做的是匹配 href 本身,更具体地说,查找包含特定参数的 URL。这是否可以在 Xpath 查询中实现,还是应该从第一个 Xpath 查询的输出开始进行操作?


是的,但搜索“needle”会返回*$node->nodeValue();中的文本部分,而不是期望的http://example.com?param=needle* ...? - MattW
1个回答

41

不确定我是否正确理解问题,但第二个XPath表达式已经实现了您所描述的功能。它不是针对A元素的文本节点进行匹配,而是针对href属性进行匹配:

$html = <<< HTML
<ul>
    <li>
        <a href="http://example.com/page?foo=bar">Description</a>
    </li>
    <li>
        <a href="http://example.com/page?lang=de">Description</a>
    </li>
</ul>
HTML;

$xml  = simplexml_load_string($html);
$list = $xml->xpath("//a[contains(@href,'foo')]");

输出:

array(1) {
  [0]=>
  object(SimpleXMLElement)#2 (2) {
    ["@attributes"]=>
    array(1) {
      ["href"]=>
      string(31) "http://example.com/page?foo=bar"
    }
    [0]=>
    string(11) "Description"
  }
}

如您所见,返回的NodeList仅包含href中包含foo的A元素(我理解这正是您要查找的内容)。它包含整个元素,因为XPath翻译为获取所有href属性包含foo的A元素。然后,您可以使用以下方法访问属性:

echo $list[0]['href'] // gives "http://example.com/page?foo=bar"

如果您只想返回属性本身,您需要执行以下操作:
//a[contains(@href,'foo')]/@href

请注意,在 SimpleXml 中,这将返回一个 SimpleXml 元素:
array(1) {
  [0]=>
  object(SimpleXMLElement)#3 (1) {
    ["@attributes"]=>
    array(1) {
      ["href"]=>
      string(31) "http://example.com/page?foo=bar"
    }
  }
}

但是现在你可以通过以下方式输出URL:

echo $list[0] // gives "http://example.com/page?foo=bar"

这是关于编程的内容,翻译成中文如下:那就是我的意思。只有在使用SimpleXML时,我的HTML文档失败了。XPath查询确实有效,使用DomXpath将其与之配合可以得到我想要的结果。谢谢! - MattW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接