Php DOMDocument的子节点丢失订单

Php DOMDocument的子节点丢失订单,php,domdocument,Php,Domdocument,我有一个html字符串。我想遍历它并提取一些信息。我的代码如下: $str = '<p>aaa</p><img src="http://stackoverflow.com/questions/ask"/><p>sss</p><img src="http://stackoverflow.com/"/>'; function parseContent($str) { $contents = array();

我有一个html字符串。我想遍历它并提取一些信息。我的代码如下:

$str = '<p>aaa</p><img src="http://stackoverflow.com/questions/ask"/><p>sss</p><img src="http://stackoverflow.com/"/>';

function parseContent($str) {
    $contents = array();

    $dom = new DOMDocument('1.0', 'UTF-8');
    if (!$dom->loadHTML($str)) {
        return $contents;
    }

    $stack = array($dom);
    while (count($stack) > 0) {
        $node = array_shift($stack);
        foreach ($node->childNodes as $node) {
            if ($node->hasChildNodes()) {
                $stack[] = $node;
            } else {
                switch ($node->nodeType) {
                    case XML_ELEMENT_NODE:
                        if ('img' == $node->tagName) {
                            $contents[] = $node->attributes->getNamedItem('src')->nodeValue;
                        }
                        break;
                    case XML_TEXT_NODE:
                        $contents[] = $node->textContent;
                        break;
                }
            }
        }
    }

    return $contents;
}

有人能指出订单丢失的原因吗?

引自评论:

这是因为每个
也有子节点(一个文本节点),所以它们进入第一个
if($node->hasChildNodes())
语句并再次堆叠

要避免这种情况,一种方法是再添加一个条件:

/* ... */
if ($node->hasChildNodes()) {
    if ($node->childNodes->length==1 && $node->childNodes->item(0)->nodeType==XML_TEXT_NODE) {
        $contents[] = $node->childNodes->item(0)->textContent;
    } else {
        $stack[] = $node;
    }
} else {
/* ... */

因为
有子节点(一个文本节点),所以它又被堆叠了一次。@路人,你能回答一下吗?我愿意接受。
/* ... */
if ($node->hasChildNodes()) {
    if ($node->childNodes->length==1 && $node->childNodes->item(0)->nodeType==XML_TEXT_NODE) {
        $contents[] = $node->childNodes->item(0)->textContent;
    } else {
        $stack[] = $node;
    }
} else {
/* ... */