No estoy seguro Entiendo la pregunta correctamente, pero la segunda expresión XPath ya hace lo que está describiendo. No coincide en contra del nodo de texto del elemento A, pero el atributo 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')]");
Salidas:
array(1) {
[0]=>
object(SimpleXMLElement)#2 (2) {
["@attributes"]=>
array(1) {
["href"]=>
string(31) "http://example.com/page?foo=bar"
}
[0]=>
string(11) "Description"
}
}
Como se puede ver, el NodeList devuelta contiene solamente el elemento A con href que contiene foo (que entiendo es lo que estás buscando). Contiene todo el elemento, porque XPath se traduce en Obtiene todos los elementos A con el atributo href que contiene foo. A continuación, acceder al atributo con
echo $list[0]['href'] // gives "http://example.com/page?foo=bar"
Si sólo desea devolver el atributo en sí, tendría que hacer
//a[contains(@href,'foo')]/@href
Nótese que en SimpleXML, esto devolvería un elemento SimpleXML sin embargo:
array(1) {
[0]=>
object(SimpleXMLElement)#3 (1) {
["@attributes"]=>
array(1) {
["href"]=>
string(31) "http://example.com/page?foo=bar"
}
}
}
pero se puede dar salida a la URL ahora por
echo $list[0] // gives "http://example.com/page?foo=bar"
Sí, pero la búsqueda de 'aguja' devuelve la parte de texto en * $ node-> nodeValue(); * y no la deseada * http: //example.com? Param = needle * ...? – MattW