#php #html #xquery
#php #HTML #xquery
Вопрос:
как анализировать вложенные html-теги, подобные этой структуре:
lt;article class="tile"gt; lt;div class="tile-content"gt; lt;a href=link-1"gt;ignorelt;/agt; lt;div class="tile-content__text tile-content__text--arrow-white"gt; lt;label class="label-date label-date--blue"gt;01.12.2021lt;/labelgt; lt;h4gt;lt;a class="link-color-black" href="link-1"gt;title-1lt;/agt;lt;/h4gt; lt;p class="tile-content__paragraph tile-content__paragraph--gray pd-ver-10"gt; content-1 lt;/pgt; lt;/divgt; lt;a href="link-1" class="btn btn-link btn-link__more btn-link--arrow-right float-right"gt;morelt;/agt; lt;/divgt;
lt;article class="tile"gt; lt;div class="tile-content"gt; lt;a href=link-1"gt;ignorelt;/agt; lt;div class="tile-content__text tile-content__text--arrow-white"gt; lt;label class="label-date label-date--blue"gt;02.12.2021lt;/labelgt; lt;h4gt;lt;a class="link-color-black" href="link-2"gt;title-2lt;/agt;lt;/h4gt; lt;p class="tile-content__paragraph tile-content__paragraph--gray pd-ver-10"gt; content-2 lt;/pgt; lt;/divgt; lt;a href="link-2" class="btn btn-link btn-link__more btn-link--arrow-right float-right"gt;morelt;/agt; lt;/divgt; lt;/articlegt;
для массива, подобного:
$parsedArray = [ 0 =gt; ['title =gt; 'title', 'link' =gt; 'link-1', 'date' =gt; '2021-12-01', 'content' =gt; 'content-1'] 1 =gt; ['title =gt; 'title-2', 'link' =gt; 'link-2', 'date' =gt; '2021-12-02', 'content' =gt; 'content-2'] ,....]
я использую xquery, как описано выше, но это удаляет все теги, после этого у меня есть только текст из всех тегов, мне нужно извлечь информацию из всех тегов, какой-нибудь совет?
$dom = new DOMDocument(); $dom-gt;loadHTML($html['html']); $xpath = new DOMXPath($dom); $nodelist = $xpath-gt;query("//article[contains(@class, 'tile')]"); foreach ($nodelist as $n) { echo 'lt;pregt;'; var_dump($n); echo 'lt;/pregt;';
}
Ответ №1:
var_dump
не будет анализировать DOM 🙂
Вам просто нужно повторно запросить ваши элементы внутри tile
, а затем назначить их массиву.
Назначьте массив рабочих элементов для определения структуры, если это имеет значение, в противном случае просто создавайте результат по ходу работы.
lt;?php $str = 'lt;article class="tile"gt; lt;div class="tile-content"gt; lt;a href=link-1"gt;ignorelt;/agt; lt;div class="tile-content__text tile-content__text--arrow-white"gt; lt;label class="label-date label-date--blue"gt;02.12.2021lt;/labelgt; lt;h4gt;lt;a class="link-color-black" href="link-2"gt;title-2lt;/agt;lt;/h4gt; lt;p class="tile-content__paragraph tile-content__paragraph--gray pd-ver-10"gt; content-2 lt;/pgt; lt;/divgt; lt;a href="link-2" class="btn btn-link btn-link__more btn-link--arrow-right float-right"gt;morelt;/agt; lt;/divgt; lt;/articlegt;'; $dom = new DOMDocument(); libxml_use_internal_errors(true); $dom-gt;loadHtml($str); libxml_clear_errors(); $xpath = new DOMXPath($dom); $result = []; foreach ($xpath-gt;query("//article[contains(@class, 'tile')]") as $tile) { // define item structure $item = [ 'title' =gt; '', 'link' =gt; '', 'date' =gt; '', 'content' =gt; '' ]; // find date $query = $xpath-gt;query("//label[contains(@class, 'label-date')][1]", $tile); if (count($query)) { $item['date'] = $query[0]-gt;nodeValue; } // find link/title $query = $xpath-gt;query("//h4/a[1]", $tile); if (count($query)) { $item['link'] = $query[0]-gt;getAttribute('href'); $item['title'] = $query[0]-gt;nodeValue; } // find content $query = $xpath-gt;query("//p[contains(@class, 'tile-content__paragraph')][1]", $tile); if (count($query)) { $item['content'] = $query[0]-gt;nodeValue; } // assign $result[] = $item; // cleanup unset($item, $query); } print_r($result);
Выход:
Array ( [0] =gt; Array ( [title] =gt; title-2 [link] =gt; link-2 [date] =gt; 02.12.2021 [content] =gt; content-2 ) )