首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在DOMDocument上循环

在DOMDocument上循环
EN

Stack Overflow用户
提问于 2010-05-26 10:51:54
回答 4查看 28.4K关注 0票数 24

我正在遵循这个问题的建议,稳健,Mature HTML Parser for PHP,关于解析DOMDocument可能格式错误的html。

有什么简单的方法可以遍历解析过的文档吗?所以我想像这样在html上循环。

代码语言:javascript
复制
$html='<ul>
         <li>value1</li>
         <li>value1</li>
         <li>value3
            <p>subvalue</p>
         </li>
        </ul>
        <p>hello world</p>';

$doc = new DOMDocument();
$doc->loadHTML($html);
???
foreach (??? as $node)
{
  print $node->nodeName.':'.$node->nodeValue;
}

得到的结果有点像这样。

代码语言:javascript
复制
 ul:
 li:value1
 li:value2
 li:value3
 p:subvalue
 p:hello world

使用$doc->childNodes本身并不能真正实现我想要的效果。因为它似乎不会向下延伸到树上较低的树枝。我使用了halfdan建议的代码,结果如下所示。

代码语言:javascript
复制
html:
html:value1
         value1
         value3
            subvalue

        hello world
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-05-26 10:59:11

试试这个:

代码语言:javascript
复制
$doc = new DOMDocument();
$doc->loadHTML($html);
showDOMNode($doc);

function showDOMNode(DOMNode $domNode) {
    foreach ($domNode->childNodes as $node)
    {
        print $node->nodeName.':'.$node->nodeValue;
        if($node->hasChildNodes()) {
            showDOMNode($node);
        }
    }    
}
票数 35
EN

Stack Overflow用户

发布于 2012-10-23 14:05:11

我遇到了具有c数据的元素的问题,在这种情况下,即使是没有子代的元素也会返回子代。

我不知道为什么会这样。

我发现周围的工作是改变

代码语言:javascript
复制
if($node->hasChildNodes()) {
        showDOMNode($node);
    }

代码语言:javascript
复制
if($node->childNodes->length != 1) {
        showDOMNode($node);
    }

代码现在可以完美地工作了。

票数 2
EN

Stack Overflow用户

发布于 2013-11-17 09:06:57

您需要使用PHP Simple HTML DOM Parser和以下代码:

代码语言:javascript
复制
<?php
require_once 'simplehtmldom/simple_html_dom.php';

function iterateHtmlElements($html)
{
    $dom = str_get_html($html);
    $dom->set_callback('handleElement');
    $dom->__toString();
    echo "\n";
}

function handleElement(simple_html_dom_node $elem)
{
    if($elem->tag == 'text') {
        echo $elem->innertext();
    }
    else {
        echo "\n" . $elem->tag . ": ";
    }
}

$html='<ul>
         <li>value1</li>
         <li>value1</li>
         <li>value3
            <p>subvalue</p>
         </li>
        </ul>
        <p>hello world</p>';
iterateHtmlElements($html);

它完全按照预期工作。我用您提供的输入进行了检查,得到了以下结果:

代码语言:javascript
复制
> php test2.php

ul:
li: value1
li: value1
li: value3
p: subvalue
p: hello world
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2909849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档