Ça m'arrive souvent de venir brancher des éléments dynamiques à l'intérieur d'un gabarit HTML. D'autres fois, c'est plutôt le contraire : je veux pouvoir extraire des parties du DOM pour les utiliser dans un contexte de programmation dynamique.
Par exemple en récupérant une portion d'une page locale ou distante, avec fopen(), file_get_contents() ou CUrl. De façon plus concrète, disons que j'ai une page web où je voudrais prélever le titre du document, c'est-à-dire le texte se trouvant entre les balises <title></title>, je peux utiliser un moyen facile d'y arriver, sans utiliser une expression régulière. Il s'agit de l'objet Zend_Dom_Query qui fait partie du Zend Framework.
En fait, il faudra se familiariser avec quelques notions :
require_once('Zend/Dom/Query.php');Deuxièmement, il faut lire le fichier modèle. Dès qu'on possède une variable qui contient le code HTML, on peut procéder à l'extraction.
$html = file_get_contents('template.php');Comme l'objet $dom contient maintenant le code HTML, on est prêt à le questionner. Ceci peut se faire par requête XPath ou par sélecteur CSS. Dans mon cas, la balise "title" ne possède pas de classe CSS donc je privilégerai le XPath. Le XPath permet de traverser un document structuré en XML ou XHTML et de lui demander d'obtenir la liste des nodes se trouvant sous un élément.
$dom = new Zend_Dom_Query($html);
Le titre étant à la racine (//) du document, on y accédera par : //title
$listDomElements = $dom->queryXpath('//title');Si vous faites imprimer le résultat, vous verrez apparaître quelque chose qui ressemble à ceci :
Zend_Dom_Query_Result Object ( [_count:protected] => [_cssQuery:protected] => [_document:protected] => DOMDocument Object ( ) [_nodeList:protected] => DOMNodeList Object ( ) [_position:protected] => 0 [_xpath:protected] => [_xpathQuery:protected] => //title )
Il s'agit d'une structure Zend_Dom_Query_Result qui contient un DomElement de PHP. Ce n'est pas un array mais comme l'objet implémente les interfaces Countable, Iterator, on peut appeler foreach() sur le jeu de résultats.
echo 'Nombre de nodes trouvés : ' . count($result);Si on préférerait obtenir une référence sur tous les DIV à l'intérieur du BODY (toujours en XPath) :
foreach($result as $node){
// textContent est une propriété de DOMElement
echo $node->textContent;
}
$result = $dom->queryXpath('//body/div');Ou si le document contient plusieurs listes (UL) et qu'on veut extraire les LI de celle qui possède la classe CSS "main" :
$result = $dom->query('.main li');Notez ici la différence : on utilise query() pour une requête par sélecteur CSS plutôt que queryXpath().
Enfin, si ce qui vous intéresse n'est pas le contenu du node mais ses attributs (ou si une vérification s'impose), DOMElement permettra d'en connaître davantage, par exemple pour détecter s'il possède un ID à la bonne valeur :
if( $node->hasAttribute('id') && $node->getAttribute('id') == 'liDefault' ){
echo "c'est celui que je cherche";
}