Разбор php html, я хочу сохранить разобранные элементы в массив

Я пытаюсь разобрать HTML-страницу и получить доступ к некоторым тегам. Я анализирую все эти теги и отображаю результат в виде отступа, который соответствует уровню тегов, например, теги заголовков h1, h2, h3 и т. д. Теперь я хочу сохранить результирующие данные (оглавление с отступом) в массив вместе с именем тегов. Пожалуйста, помогите мне разобраться в моей проблеме.

Вот мой php код … Я использую html dom parser.

include ("simple_html_dom.php");
session_start();
error_reporting(0);
$string = file_get_contents('test.php');

$tags = array(0 => '<h1', 1 => '<h2', 2 => '<h3', 3 => '<h4', 4 => '<h5', 5 => '<h6');

function parser($html, $needles = array()){
$positions = array();
foreach ($needles as $needle){
$lastPos = 0;
while (($lastPos = strpos($html, $needle, $lastPos))!== false)
{
$positions[] = $lastPos;
$lastPos = $lastPos + strlen($needle);
}

unset($needles[0]);
if(count($positions) > 0){
break;
}
}

if(count($positions) > 0){
for ($i = 0; $i < count($positions); $i++) {
?>
<div class="<?php echo $i; ?>" style="padding-left: 20px; font-size: 14px;">
<?php

if($i < count($positions)-1){
$temp = explode('</', substr($html, $positions[$i]+4));
$pos = strpos($temp[0], '>');
echo substr($temp[0], $pos);
parser(substr($html, $positions[$i]+4, $positions[$i+1]-$positions[$i]-4), $needles);
} else {
$temp = explode('</', substr($html, $positions[$i]+4));
$pos = strpos($temp[0], '>');
echo substr($temp[0], $pos+1);
parser(substr($html, $positions[$i]+4), $needles);
}

?>
</div>

<?php
}
} else {
// not found any position of a tag
}
}
parser($string, $tags);

0

Решение

Если вы хотите сделать это с помощью SimpleXML и XPath, есть более короткая и более читаемая версия, которую вы можете попробовать …

$xml = new SimpleXMLElement($string);
$tags = $xml->xpath("//h1 | //h2 | //h3 | //h4");
$data = [];
foreach ( $tags as $tag )   {
$elementData['name'] = $tag->getName();
$elementData['content'] = (string)$tag;
$data[] = $elementData;
}

print_r($data);

Вы можете увидеть шаблон в XPath — он объединяет любые элементы, которые вам нужны. Использование // означает найти на любом уровне, а затем имя элемента, который вы хотите найти. Они объединены с использованием |, который является оператором ‘или’. Это можно легко расширить, используя выражения того же типа, чтобы создать полный набор тегов, который вам нужен.

Затем программа перебирает найденные элементы и строит массив каждого элемента за раз. Взятие имени и содержимого и добавление их в массив $ data.

Обновить:
Если ваш файл не является правильно сформированным XML, вам, возможно, придется использовать DOMDocument и loadHTML. Только небольшая разница, но более терпимая к ошибкам …

$string = file_get_contents("links.html");
$xml = new DOMDocument();
libxml_use_internal_errors();
$xml->loadHTML($string);
$xp = new DOMXPath($xml);
$tags = $xp->query("//h1 | //h2 | //h3 | //h4");
$data = [];
foreach ( $tags as $tag )   {
$elementData['name'] = $tag->tagName;
$elementData['content'] = $tag->nodeValue;
$data[] = $elementData;
}

print_r($data);
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector