PHP дом получить несколько элементов из цикла - PullRequest
0 голосов
/ 04 октября 2019

ниже моя html структура, я хочу выводить как: содержимое внутри post_message div и соответствующие изображения

что-то вроде:

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

HTML-контент

<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);
}

1 Ответ

2 голосов
/ 04 октября 2019

При использовании 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,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...