В классе DOMDocument существуют методы для получения элементов по id и по имени тега (getElementById & getElementsByTagName), но не по классу. Есть ли способ сделать это?
В качестве примера, как бы выбрать div из следующей разметки?
<html> ... <body> ... <div class="foo"> ... </div> ... </body> </html>
Простым ответом является использование xpath:
$dom = new DomDocument(); $dom->loadHtml($html); $xpath = new DomXpath($dom); $div = $xpath->query('//*[@class="foo"]')->item(0);
Но это не будет принимать пробелы. Поэтому для выбора класса, разделенного пробелом, используйте этот запрос:
//*[contains(concat(' ', normalize-space(@class), ' '), ' class ')
$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>";
В дополнение к ответу ircmaxell, если вам нужно выбрать класс, разделенный пробелом:
$dom = new DomDocument(); $dom->loadHtml($html); $xpath = new DomXpath($dom); $classname='foo'; $div = $xpath->query("//table[contains(@class, '$classname')]")->item(0);