Intereting Posts
Узнайте, где замедляется ваш PHP-код (проблема с производительностью) получить значение групп переключателей, используя jquery PHP preg_replace_callback, замените только 1 обратную ссылку? Как выйти из скрипта PHP без вызова деструктора? php pdo подключен к DB2 по-разному CODEPAGE Как подавить предупреждение phpseclib «Недействительный HMAC» PHP | Почему я должен использовать статическую / приватную статическую функцию вместо функции public / private? База данных MySql исключает AM, PM, из datetime, timestamp, time, PHP, SQL Как извлечь HTTP-ссылки из абзаца и сохранить их в массиве на php Выполнение функции PHP из JSON Как зашифровать пароль перед отправкой из формы входа? Symfony2: отправьте запрос HTTP почему Пытается получить свойство ошибки, отличной от объекта PHP DOM получить nodevalue html? (без зачистки меток) Ошибка синтаксического анализа строки PHP с необходимой точкой с запятой после переменной

Использование DOMDocument для извлечения из HTML-документа по классу

В классе DOMDocument существуют методы для получения элементов по id и по имени тега (getElementById & getElementsByTagName), но не по классу. Есть ли способ сделать это?

В качестве примера, как бы выбрать div из следующей разметки?

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

Related of "Использование DOMDocument для извлечения из 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);