"Обход" не вложенных divs с помощью простого синтаксического анализатора PHP HTML DOM
Я пытаюсь проанализировать структуру HTML, подобную этой, с помощью простого синтаксического анализатора PHP HTML DOM (фактический код немного более запутанный и содержит ссылки и изображения между ними, но это, похоже, не проблема):
<div class="members">
<div class="membergroup">Admin</div>
<div class="membername">Member 1</div>
<div class="membername">Member 2</div>
<div class="membername">Member 3</div>
<div class="membergroup">Moderator</div>
<div class="membername">Member 4</div>
<div class="membername">Member 5</div>
<div class="membergroup">Member</div>
<div class="membername">Member 6</div>
<div class="membername">Member 7</div>
</div>
У меня возникли проблемы с поиском какого-либо разумного способа перечислить всех членов определенной группы (я не могу быть уверен, сколько членов в каждой группе). Какой-то цикл может быть подходящим, но я не могу понять, как напечатать, скажем, 1-го члена 3-й группы (член 6 в этом примере).
Есть руководство, но я не смог найти решение: http://simplehtmldom.sourceforge.net/manual.htm
Судя по структуре divs, ни один из участников на самом деле не вложен в divs "группы участников", а находится непосредственно под ними.
Вот что у меня есть на данный момент:
<?php
require_once 'scripts/lib/simple_html_dom.php';
$html = file_get_html('test_reference.html'); // The example shown above
// We know the total amount of members.
// However, we don't know who and how many belong to a particular group in advance.
$membercount = 7;
$e = $html->find('div.members', 0)->find('div.membergroup', 0);
if ($e->plaintext === "Admin") {
echo "We are inside the 'Admin' div now!<br />";
echo "Member is called: ";
// ... But we have to go back to the parent,
// because 'membername' isn't inside 'membergroup' :-(
echo $e->parent()->find('div.membername', 0)->plaintext;
echo "<br /><br />";
}
// Same thing, but to the third group ('Member') now instead of 'Admin'
$e = $html->find('div.members', 0)->find('div.membergroup', 2);
if ($e->plaintext === "Member") {
echo "We are inside the 'Member' div now!<br />";
echo "Member is called: ";
// Wrong! We want the first (0th) member of the 'Member' group.
echo $e->parent()->find('div.membername', 0)->plaintext;
echo "<br /><br />";
}
?>
Вывод будет следующим:
Теперь мы внутри раздела "Администратор"! Участник называется: Участник 1
Мы находимся внутри Раздел "Участник" сейчас же! Участник называется: Участник 1//Это неправильно, должно быть 6
1 answers
Когда вы нашли membergroup
, который ищете, используйте следующую строку кода в цикле, пока он не вернет другой membergroup
или не достигнет последнего элемента:
$e = $e->next_sibling();
PHP Простой HTML DOM Парсер - Ссылка на API
элемент
$e->next_sibling()
Возвращает следующий родственный элемент или значение null, если не найдено.