web-dev-qa-db-ja.com

PHP Xpath:針を含むすべてのhref値を取得します

PHP Xpathを使用して、HTMLページ内の特定のリンクをすばやくプルしようとしています。

以下は、mypage.html上のすべてのhrefリンクを検索します。$nodes = $x->query("//a[@href]");

以下は、すべてのhrefリンクを検索します。 説明 私の針と一致します:$nodes = $x->query("//a[contains(@href,'click me')]");

私が達成しようとしているのは、href自体のマッチング、より具体的には特定のパラメーターを含むURLの検索です。 Xpathクエリ内でそれは可能ですか、それとも最初のXpathクエリからの出力の操作を開始する必要がありますか?

18
MattW

質問を正しく理解しているかどうかはわかりませんが、2番目の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には、fooを含むhrefを持つA要素のみが含まれています(これはあなたが探しているものであると私は理解しています)。 XPathはfooを含むhref属性を持つすべての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"
39
Gordon