php - "Traversing"使用 PHP 简单 HTML DOM 解析器的未嵌套 div

标签 php html dom html-parsing

我正在尝试使用 PHP Simple HTML DOM Parser 解析这样的 HTML 结构(实际代码稍微有点困惑,中间包含链接和图像,但这些似乎不是问题):

<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>

我无法找到一些合理的方法来列出特定组中的所有成员(我无法确定每个组中有多少成员)。某种循环可能是合适的,但我不知道如何打印第 3 组的第 1 个成员(本例中为第 6 个成员)。

有手册,但我一直找不到解决方案:http://simplehtmldom.sourceforge.net/manual.htm

div 的结构方式,实际上没有任何成员嵌套在“membergroup”div 中,而是直接在它们下面。

这是我目前所拥有的:

<?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 />";
    }
?>

输出将是:

We are inside the 'Admin' div now! Member is called: Member 1

We are inside the 'Member' div now! Member is called: Member 1 // This is wrong, should be 6

最佳答案

找到要查找的 membergroup 后,在循环中使用以下代码行,直到它返回另一个 membergroup 或到达最后一个元素:

$e = $e->next_sibling();

PHP Simple HTML DOM Parser - API Reference

element $e->next_sibling()

Returns the next sibling of element, or null if not found.

关于php - "Traversing"使用 PHP 简单 HTML DOM 解析器的未嵌套 div,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31354860/

相关文章:

html - 如何使 div 成为可点击的链接?

javascript - 从源中完全删除标签

php - Laravel 5.4 存储链接

php - 完全理解 PDO ATTR_PERSISTENT

javascript - 计算价格表格 Excel javascript

html - 如何从 Windows 剪贴板快速渲染 html/xhtml

html - 您是否仍然可以影响显示 : none? 的元素的状态

javascript - 用 Cheerio 替换 HTML Node

php - laravel中使用groupBy()函数求和查询

php - 如何使用 Google API 从多个 Google Analytics 帐户中检索数据?