Intereting Posts
Laravel 5 аутентифицирует пользователей через внешний API Zend Framework 1.9 и интеграция доктрин Как я могу повторить водяной знак во всем запрошенном изображении с помощью PHP? jquery .ajax всегда возвращает ошибку – данные добавляются в базу данных php send mail form не работает с электронными письмами в одном домене Проблемы с безопасным связыванием с Active Directory с помощью PHP Удалить расширение php веб-сайта с помощью htaccess Ошибка значения <br типа java.lang.String не может быть преобразована в JSONObject Обновление PHP-версии вызвало проблемы с конструкторами классов Массивы слияния PHP с значениями NOT DUPLICATED Получать данные за последние 8 часов в столбце datetime Eloquent Передать переменные в приложение iFrame Facebook Лучший способ реализовать счетчик загрузки? Используйте mod_rewrite для удаления расширения .php и очистки URL-адресов GET одновременно Как предотвратить XSS с HTML / PHP?

Создать массив из содержимого тегов <div> в php

У меня есть содержимое веб-страницы, назначенной переменной $html

Ниже приведен пример содержимого $html :

 <div class="content">something here</div> <span>something random thrown in <strong>here</strong></span> <div class="content">more stuff</div> 

Как, используя PHP, я могу создать массив из того, что находит содержимое областей <div class="content"></div> подобных этому (для примера выше), поэтому:

 echo $array[0] . "\n" . $array[1]; //etc 

выходы

 something here more stuff 

Предполагая, что это просто упрощенный случай в OP, и реальная ситуация сложнее, вы захотите использовать XPath.

Если это действительно сложно, то вы можете использовать DOMDocument (с DOMXPath ), но вот простой пример с использованием SimpleXML

 $xml = new SimpleXMLElement($html); $result = $xml->xpath('//div[@class="content"]'); while(list( , $node) = each($result)) { echo $node,"\n"; } 

Поскольку вы явно задали вопрос о создании массива для этого, вы можете использовать:

 $res_Arr = array(); while(list( , $node) = each($result)) { $res_Arr[] = $node; } 

и $res_Arr будет массивом с содержимым, которое вы ищете.

См. http://php.net/manual/en/simplexmlelement.xpath.php для php SimpleXML Xpath info и http://www.w3.org/TR/xpath для спецификаций XPath

PHP имеет несколько способов обработки HTML, включая DomDocument и SimpleXML . См. Раздел Анализ HTML с PHP и DOM . Вот пример:

 $dom = new DomDocument; $dom->loadHTML($html); $dom->preserveWhiteSpace = false; $divs = $dom->getElementsByTagName('div'); foreach ($divs as $div) { $class = $div->getAttribute('class'); if ($class == 'content') { echo $div->nodeValue . "\n"; } } 

Технически атрибут класса может быть несколькими классами, поэтому вы можете использовать:

 $classes = explode(' ', $class); if (in_array('content', $classes)) { ... } 

Подход SimpleXML / XPath более краткий, но если вы не хотите идти по пути XPath (и изучать другую технологию, по крайней мере, достаточно для выполнения таких задач), то вышеперечисленное является альтернативой для программирования.

Там мало что можно сделать, если не использовать функцию строковых манипуляций или регулярные выражения. вы можете загрузить свой HTML как XML с помощью библиотеки DOM и использовать его для перехода к вашему div, но это может стать громоздким, если вы не будете осторожны или сложность структуры.

http://ca3.php.net/manual/en/book.dom.php

Похоже, Kalem13 избил меня, но я согласен. Вы можете использовать класс DOMDocument. Я не использовал его лично, но я думаю, что это сработает для вас. Сначала вы создаете экземпляр объекта DOMDocument, затем вы загружаете переменную $ html с помощью функции loadHTML () . Затем вы можете использовать функцию getElementsByTagName () .

Вы, вероятно, должны использовать preg_match_all ()

 $matches = array(); preg_match_all('`\<div(.*?)class\=\"content\"(.*?)\>(.*?)\<\/div\>`iUsm',$html,$matches,PREG_SET_ORDER); foreach($matches as $m){ // $m[3] represents the content in <div class="content"> }