2010-03-06 12 views
16

Trabajando con PHP Xpath tratando de extraer rápidamente ciertos enlaces dentro de una página html.PHP Xpath: obtenga todos los valores href que contienen la aguja

A continuación encontrará todos los enlaces href en mipagina.html: $nodes = $x->query("//a[@href]");

Mientras que la siguiente encontrará todos los enlaces href cuando la descripción coincide con mi aguja: $nodes = $x->query("//a[contains(@href,'click me')]");

lo que estoy tratando de lograr es coincidir en el propio href, url's de búsqueda más específicos que contienen ciertos parámetros. ¿Es eso posible dentro de una consulta Xpath o debería simplemente comenzar a manipular la salida de la primera consulta Xpath?

+0

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

Respuesta

35

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" 
+0

eso es lo que quise decir. Solo mi documento html falla al usar SimpleXML. Sin embargo, la consulta xpath funciona y usarla con DomXpath me da lo que quiero. ¡Gracias! – MattW

Cuestiones relacionadas