*Mise à jour : version Xpath de `[@class~='my-class']` sélecteur css**
Donc, après mon commentaire ci-dessous en réponse au commentaire de hakre, j'ai été curieux et j'ai regardé dans le code derrière Zend_Dom_Query
. Il semble que le sélecteur ci-dessus soit compilé dans le xpath suivant (non testé) :
[contains(concat(' ', normalize-space(@class), ' '), ' my-class ')]
Donc le PHP serait :
$dom = new DomDocument();
$dom->load($filePath);
$finder = new DomXPath($dom);
$classname="my-class";
$nodes = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]");
Fondamentalement, tout ce que nous faisons ici est de normaliser le class
de sorte que même une seule classe soit délimitée par des espaces et que la liste complète des classes soit délimitée par des espaces. Ensuite, ajoutez un espace à la classe que nous recherchons. De cette façon, nous recherchons et trouvons effectivement uniquement des instances de my-class
.
Utiliser un sélecteur xpath ?
$dom = new DomDocument();
$dom->load($filePath);
$finder = new DomXPath($dom);
$classname="my-class";
$nodes = $finder->query("//*[contains(@class, '$classname')]");
S'il ne s'agit que d'un seul type d'élément, vous pouvez remplacer la balise *
avec le tagname particulier.
Si vous avez besoin de faire beaucoup de choses de ce genre avec un sélecteur très complexe, je recommande Zend_Dom_Query
qui prend en charge la syntaxe des sélecteurs CSS (à la jQuery) :
$finder = new Zend_Dom_Query($html);
$classname = 'my-class';
$nodes = $finder->query("*[class~=\"$classname\"]");
2 votes
Relooké : PHP dom pour obtenir une classe de tag avec plusieurs noms de classe css