Как распарсить HTML с неограниченной глубиной вложенности?

Здравствуйте!
Возникла проблема распарсить html-структуру. Приведу пример кода который удалось написать:
$a = '<span style="font-size:18px"><span style="color:#FF0000">Apollo 11 was the spaceflight that <span style="font-family:courier new,courier,monospace">landed the first humans</span></span><span style="font-family:courier new,courier,monospace">, Americans </span>Neil Armstrong and Buzz Aldrin, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.</span>';
$dom = new DOMDocument;
$dom->loadHTML($a);
echo '<pre>';
foreach($dom->documentElement->childNodes as $item){
	var_dump('0 -> '.$item->nodeName);
	if($item->nodeName != '#text'){
		foreach($item->childNodes as $item2){
			var_dump('1 -> '. $item2->nodeName);
			if($item2->nodeName != '#text'){
				foreach($item2->childNodes as $item3){
					var_dump('2 -> '. $item3->nodeName);
					if($item3->nodeName != '#text'){
						foreach($item3->childNodes as $item4){
							var_dump('3 -> '. $item4->nodeName);
							if($item4->nodeName != '#text'){
								foreach($item4->childNodes as $item5){
									var_dump('4 -> '. $item5->nodeName);
								}
							}
						}
					}
				}
			}
		}
	}
}

codepad.org/tg1jrGNc
Проблема заключается в том, что глубина вложенности тегов может быть очень большая. Писать кучу foreach'ей очень плохой вариант. Как можно решить проблему нормальным способом?
  • Вопрос задан
  • 385 просмотров
Пригласить эксперта
Ответы на вопрос 2
jacksparrow
@jacksparrow
Пользуйтесь готовой библиотекой
Simple HTML DOM как пример
Ответ написан
Комментировать
kemply
@kemply
школьник
Воспользуйтесь рекурсивной функцией

$a = '<span style="font-size:18px"><span style="color:#FF0000">Apollo 11 was the spaceflight that <span style="font-family:courier new,courier,monospace">landed the first humans</span></span><span style="font-family:courier new,courier,monospace">, Americans </span>Neil Armstrong and Buzz Aldrin, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.</span>';
$dom = new DOMDocument;
$dom->loadHTML($a);
echo '<pre>';

function recurse($a, $i){
	
	var_dump("$i -> " . $a->nodeName );
	if( $a->nodeName != '#text' )
		foreach( $a->childNodes as $t )
			recurse($t, $i+1);
	
}

foreach( $dom->documentElement->childNodes as $i )
	recurse($i, 0);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы