Php DOMDocument的子节点丢失订单
我有一个html字符串。我想遍历它并提取一些信息。我的代码如下: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();
$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 {
/* ... */