Update: Xpath-Version des *[@class~='my-class']
CSS-Selektors
Nach meinem Kommentar als Antwort auf den Kommentar von hakre wurde ich neugierig und schaute in den Code dahinter Zend_Dom_Query
. Es sieht so aus, als ob der obige Selektor zu folgendem xpath (ungetestet) kompiliert wurde:
[contains(concat(' ', normalize-space(@class), ' '), ' my-class ')]
so wäre das php:
$dom = new DomDocument();
$dom->load($filePath);
$finder = new DomXPath($dom);
$classname="my-class";
$nodes = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]");
Grundsätzlich normalisieren wir hier nur das class
Attribut, sodass auch eine einzelne Klasse durch Leerzeichen und die gesamte Klassenliste durch Leerzeichen begrenzt wird. Fügen Sie dann die gesuchte Klasse mit einem Leerzeichen hinzu. Auf diese Weise suchen und finden wir effektiv nur Instanzen von my-class
.
Xpath-Selektor verwenden?
$dom = new DomDocument();
$dom->load($filePath);
$finder = new DomXPath($dom);
$classname="my-class";
$nodes = $finder->query("//*[contains(@class, '$classname')]");
Wenn es sich immer nur um einen Elementtyp handelt, können Sie den *
durch den jeweiligen Tagnamen ersetzen .
Wenn Sie viel davon mit einem sehr komplexen Selektor tun müssen, würde ich empfehlen, Zend_Dom_Query
der die CSS-Selektorsyntax (a la jQuery) unterstützt:
$finder = new Zend_Dom_Query($html);
$classname = 'my-class';
$nodes = $finder->query("*[class~=\"$classname\"]");