PHP Xpathを使用して、HTMLページ内の特定のリンクをすばやくプルしようとしています。
以下は、mypage.html上のすべてのhrefリンクを検索します。$nodes = $x->query("//a[@href]");
以下は、すべてのhrefリンクを検索します。 説明 私の針と一致します:$nodes = $x->query("//a[contains(@href,'click me')]");
私が達成しようとしているのは、href自体のマッチング、より具体的には特定のパラメーターを含むURLの検索です。 Xpathクエリ内でそれは可能ですか、それとも最初のXpathクエリからの出力の操作を開始する必要がありますか?
質問を正しく理解しているかどうかはわかりませんが、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"