2015-07-11 44 views
2

我试图用PHP解析一个像这样的HTML结构简单的HTML DOM解析器(实际的代码稍微混乱一些,包含链接和图片之间的内容,但这些似乎并不成为一个问题):使用PHP“遍历”未嵌套的div简单的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> 

我无法找到一些合理的方式列出特定组中的所有成员(我不能肯定有多少成员有各组)。某种循环可能是合适的,但我无法弄清楚如何打印第三组的第一个成员(本例中为成员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 />"; 
    } 
?> 

输出将是:

我们都在里面 '管理',现在格设置! 会员被称为:会员1

我们现在在'会员'div里面! 成员称为:会员1 //这是不对的,应该是6

回答

0

当你已经找到了membergroup,而您正在寻找,使用下面的代码行中循环,直到它返回另一个membergroup或者达到最后一个元素:

$e = $e->next_sibling(); 

PHP Simple HTML DOM Parser - API Reference

元素$e->next_sibling()

返回元素的下一个兄弟元素,如果未找到,则返回null。

相关问题