"Обход" не вложенных 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

Author: rain, 2015-07-11

1 answers

Когда вы нашли membergroup, который ищете, используйте следующую строку кода в цикле, пока он не вернет другой membergroup или не достигнет последнего элемента:

$e = $e->next_sibling();

PHP Простой HTML DOM Парсер - Ссылка на API

элемент $e->next_sibling()

Возвращает следующий родственный элемент или значение null, если не найдено.

 0
Author: spenibus, 2015-10-07 22:27:01