У меня есть содержимое веб-страницы, назначенной переменной $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, но это может стать громоздким, если вы не будете осторожны или сложность структуры.
Похоже, 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"> }