Не уверен, что я правильно понял вопрос, но второе выражение XPath уже делает то, что вы описываете. Это не соответствует против текстового узла элемента, но 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 (я понимаю, это то, что вы ищете). Он связывает весь элемент, потому что 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"
Да, но поиск «иглы» возвращает текстовую часть в * $ node-> nodeValue(); * и не желаемый * http: //example.com? Param = needle * ...? – MattW