Работа с PHP Xpath пытающийся быстро вытянуть определенные ссылки в странице HTML.
Следующее найдет все ссылки href на mypage.html: $nodes = $x->query("//a[@href]");
Принимая во внимание, что следующее найдет все ссылки href, где описание соответствует моей игле: $nodes = $x->query("//a[contains(@href,'click me')]");
То, чего я пытаюсь достигнуть, соответствует на самом href, более определенный URL открытия, которые содержат определенные параметры. Это возможно в запросе Xpath, или я должен только начать управлять выводом сначала запрос Xpath?
Не уверен, что я правильно понял вопрос, но второй 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 содержит только элемент A с href, содержащим foo (как я понимаю, это то, что вы ищем). Он охватывает весь элемент, потому что XPath преобразуется в Извлечь все элементы A с атрибутом href, содержащим foo . Затем вы получите доступ к атрибуту с помощью
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"