2011-02-25 14 views
5

En la clase DOMDocument hay métodos para obtener elementos por id y por nombre de etiqueta (getElementById & getElementsByTagName) pero no por clase. ¿Hay alguna forma de hacer esto?Usando DOMDocument para extraer del documento HTML por clase

Como ejemplo, ¿cómo seleccionaría el div del siguiente marcado?

<html> 
... 
<body> 
... 
<div class="foo"> 
... 
</div> 
... 
</body> 
</html> 
+0

posible duplicado de [DOMDocument necesita buscar un elemento que tenga clase de atributo = "algo"] (http://stackoverflow.com/questions/3443701/domdocument-need-to-search-for-an-element-that-has-attribute-class-something) – mario

Respuesta

11

La respuesta simple es utilizar XPath:

$dom = new DomDocument(); 
$dom->loadHtml($html); 
$xpath = new DomXpath($dom); 
$div = $xpath->query('//*[@class="foo"]')->item(0); 

Pero eso no aceptará espacios. Así que para seleccionar por espacio separado de clase, utilice esta consulta:

//*[contains(concat(' ', normalize-space(@class), ' '), ' class ') 
+0

Buena respuesta. Pásame a eso. –

+0

Ver mi alternativa usando la tabla [contiene (@class, '$ classname')] – RafaSashi

2
$html = '<html><body><div class="foo">Test</div><div class="foo">ABC</div><div class="foo">Exit</div><div class="bar"></div></body></html>'; 

$dom = new DOMDocument(); 
@$dom->loadHtml($html); 

$xpath = new DOMXPath($dom); 

$allClass = $xpath->query("//@class"); 
$allClassBar = $xpath->query("//*[@class='bar']"); 

echo "There are " . $allClass->length . " with a class attribute<br>"; 

echo "There are " . $allClassBar->length . " with a class attribute of 'bar'<br>"; 
0

Además de ircmaxell de responder si es necesario seleccionar por espacio de clase separada:

$dom = new DomDocument(); 
$dom->loadHtml($html); 
$xpath = new DomXpath($dom); 
$classname='foo'; 
$div = $xpath->query("//table[contains(@class, '$classname')]")->item(0); 
Cuestiones relacionadas