Анализ новой строки DOMDocument работает с span, но не с img


Смотрите здесь: https://ideone.com/bjs3IC

Почему новая строка правильно отображается с spans, но не imgs?

<?php
    outputImages();
    outputSpans();




    function outputImages(){
        $html = "<div class='test'>
                    <pre>
                    <img src='http://d...content-available-to-author-only...e.com/5x5/000/fff'>
                    <img src='http://d...content-available-to-author-only...e.com/5x5/000/fff'>
                    <img src='http://d...content-available-to-author-only...e.com/5x5/000/fff'>
                    </pre>
                </div>";
        getHtml($html);
    }


    function outputSpans(){
        $html = "<div class='test'>
                    <pre>
                    <span>a</span>
                    <span>b</span>
                    <span>c</span>
                    </pre>
                </div>";
        getHtml($html);
    }


    function getHtml($html){
        $doc = new DOMDocument;
        $doc->loadhtml($html);
        $xpath = new DOMXPath($doc);
        $tags = $xpath->query('//div[@class="test"]');
        print(get_inner_html($tags[0]));
    }


    function get_inner_html( $node ) {
        $innerHTML= '';
        $children = $node->childNodes;
        foreach ($children as $child) {
            $innerHTML .= $child->ownerDocument->saveXML( $child );
        }

        return $innerHTML;
    }
Author: ParoX, 2016-05-19

1 answers

Функция DOMDocument::loadHTML имеет второй параметр options. Похоже, что LIBXML_NOBLANKS является (по крайней мере, одним из) значений по умолчанию там.

Вы можете использовать

$doc->loadhtml($html, LIBXML_NOEMPTYTAG);

Чтобы переопределить это значение по умолчанию, и ваш код будет работать одинаково для двух образцов.

P.s.
Не уверен, почему вы используете

print(get_inner_html($tags[0]));

Переменная $tags является DOMNodeList, поэтому вы должны использовать $tags->item(0) для получения первого тега.

Ваш полный код должен выглядеть следующим образом:

outputImages();
outputSpans();

function outputImages() {
    $html = "<div class='test'>
                <pre>
                <img src='http://d...content-available-to-author-only...e.com/5x5/000/fff'>
                <img src='http://d...content-available-to-author-only...e.com/5x5/000/fff'>
                <img src='http://d...content-available-to-author-only...e.com/5x5/000/fff'>
                </pre>
            </div>";
    getHtml($html);
}

function outputSpans() {
    $html = "<div class='test'>
                <pre>
                <span>a</span>
                <span>b</span>
                <span>c</span>
                </pre>
            </div>";
    getHtml($html);
}

function getHtml($html) {
    $doc = new DOMDocument;
    $doc->loadHTML($html, LIBXML_NOEMPTYTAG);
    $xpath = new DOMXPath($doc);
    $tags = $xpath->query('//div[@class="test"]');
    print(get_inner_html($tags->item(0)));
}

function get_inner_html( $node ) {
    $innerHTML= '';
    $children = $node->childNodes;
    foreach ($children as $child) {
        $innerHTML .= $child->ownerDocument->saveXML( $child );
    }
    return $innerHTML;
}
 2
Author: Dekel, 2016-06-15 16:47:32