首页 > 解决方案 > php dom从循环中获取多个元素

问题描述

下面是我的 html 结构,我想要输出如下: post_message div 中的内容和相应的图像

就像是 :

test 123 -> 1.png
test 1232 -> 2.png
test 1232 -> 3.png

网页内容

<div class="abc">
    <div>
        <div class="udata">
            <div class="post_message"><p>test 123</p></div>
            <div class="">
                <img class="scaledImageFitWidth img" src="1.png">
            </div>
        </div>
    </div>
</div>
<div class="abc">
    <div>
        <div class="udata">
            <div class="post_message"><p>test 1232</p></div>
            <div class="">
                <img class="scaledImageFitWidth img" src="2.png">
                <img class="scaledImageFitWidth img" src="3.png">
            </div>
        </div>
    </div>
</div>

下面是我的 php 代码,但它似乎不起作用:

<?php 
$dom = new DomDocument();
// $dom->load($filePath);
@$dom->loadHTML($fop);
$finder = new DomXPath($dom);
$classname="udata";
$nodes = $finder->query("//*[contains(@class, '$classname')]");

// print_r($nodes);

foreach ($nodes as $i => $node) {


    $entries = $finder->query("//*[contains(@class, 'post_message')]", $node);
    print_r($entries);

    $isrc  =  $node->query("//img/@src");
    print_r($isrc);
}

标签: phpdom

解决方案


使用 XPath 时,您总是需要使您的 XPath 相对于起始节点,因此使用descendant轴来确保您限制后续搜索仅在起始点的节点部分。

所以代码看起来更像......

foreach ($nodes as $i => $node) {
    $entries = $finder->query("descendant::*[contains(@class, 'post_message')]", $node);
    echo $entries[0]->textContent .":";

    $isrc  =  $finder->query("descendant::img/@src", $node);
    foreach ( $isrc as $src )   {
        echo $src->textContent.",";
    }
    echo PHP_EOL;
}

这将输出

test 123:1.png,
test 1232:2.png,3.png,

推荐阅读