PHP简单HTML DOM解析

PHP简单HTML DOM解析,php,html,simple-html-dom,Php,Html,Simple Html Dom,我想使用dom解析器从一些html代码中提取一些信息,但我在某一点上被卡住了 <div id="posts"> <div class="post"> <div class="user">me:</div> <div class="post">I am an apple</div> </div> <div class="post">

我想使用dom解析器从一些html代码中提取一些信息,但我在某一点上被卡住了

<div id="posts">
    <div class="post">
        <div class="user">me:</div>
        <div class="post">I am an apple</div>
    </div>
    <div class="post">
        <div class="user">you:</div>
        <div class="post">I am a banana</div>
    </div>
    <div class="post">
        <div class="user">we:</div>
        <div class="post">We are fruits</div>
    </div>
</div>
这将打印帖子

$posts = $html->find('div[class=post]');
foreach($posts as $post)
    echo $post->innertext;
我想把它们打印在一起,而不是单独打印,就像这样:

me:
I am an apple
you:
I am a banana
we:
We are fruits
如何使用解析器实现这一点?

使用下面的代码

$users= $html->find('div[class=user]');
$posts = $html->find('div[class=post]');
foreach($users as $i=>$user){
    echo $user->innertext."<br>";
echo $posts[$i]->innertext;
    }
$users=$html->find('div[class=user]”);
$posts=$html->find('div[class=post]');
foreach($i=>$user的用户){
echo$user->innertext.“
”; echo$posts[$i]->innertext; }

希望这对您有所帮助

假设您正在使用,您可以使用逗号分隔符格式的
find()
。试试这个:

$posts = $html->find('div.post');
foreach($posts as $post){
  $children = $post->find('div.user,div.post');
  foreach($children as $child){
    echo $child->class.' -- ';
    echo $child->innerText(); echo '<br>';
  }
}

使用您提供的标记,您只需指出主div(div#posts)的子级,然后循环所有子级。然后,对于每个孩子,只需获得第一个和第二个:

foreach($html->find('div#posts', 0)->children() as $post) {
    $user = $post->children(0)->innertext;
    $post = $post->children(1)->innertext;
    echo $user . '<br/>' . $post . '<hr/>';
}

也许?如果你的html如你所示,你可以使用
strip\u tags()
以非常简单的方式获取输出strip\u tags将代码与文本分离,但我想做的是解析。这种格式有效,但如果我不知道是否有其他孩子呢?这不会对用户和帖子造成影响,不过。@geogeirimiciuc
$child->class
也可以。再说一次,如果我不知道是否还有更多的孩子呢?我想解析确切的特定div。@georgeirimicuc它的问题是,如果有多个div,以及类似的类,该怎么办?由于您提供的html标记在您想要的值上设置了特定的位置,因此通过子项来获得它似乎是直截了当的。无论如何,您也可以使用
->class
属性来检查它,
->class==“user”
这将失败,因为“div class=post”的数量多于div class=user。(非常糟糕的格式设计)
user -- me:
post -- I am an apple
user -- you:
post -- I am a banana
user -- we:
post -- We are fruits
foreach($html->find('div#posts', 0)->children() as $post) {
    $user = $post->children(0)->innertext;
    $post = $post->children(1)->innertext;
    echo $user . '<br/>' . $post . '<hr/>';
}
$dom = new DOMDocument;
$dom->loadHTML($html_markup);
$xpath = new DOMXpath($dom);
$elements = $xpath->query('//div[@id="posts"]/div[@class="post"]');
foreach($elements as $posts) {
    $user = $xpath->evaluate('string(./div[@class="user"])', $posts);
    $post = $xpath->evaluate('string(./div[@class="post"])', $posts);
    echo $user . '<br/>' . $post . '<hr/>';
}