【问题标题】:PHP DOM get nodevalue html? (without stripping tags)PHP DOM获取nodevalue html? (不剥离标签)
【发布时间】:2011-09-11 07:07:34
【问题描述】:

我正在尝试使用 nodeValue 在文件中获取 div 标签的 innerhtml,但是此代码仅输出纯文本,并且似乎从 div 中去除了所有 html 标签。如何更改此代码以输出 div 的 HTML 内容而不是纯文本,并且还输出包装它的子元素的主 div。

例子:

file.txt 的内容:

<div class="1"><span class="test">text text text</span></div>
<div class="2"><span class="test">text text text</span></div>
<div class="3"><span class="test">text text text</span></div>

script.php:

  $file= file_get_contents('file.txt');

    $doc = new DOMDocument();

    @$doc->loadHTML('<?xml encoding="UTF-8">'.$file); 

    $entries = $doc->getElementsByTagName('div');

        for ($i=0;$i<$entries->length;$i++) {
            $entry = $entries->item($i);
            echo $entry->nodeValue;
        }

输出:文本文本文本文本文本文本文本文本文本

我需要它输出什么:

<div class="1"><span class="test">text text text</span></div>
<div class="2"><span class="test">text text text</span></div>
<div class="3"><span class="test">text text text</span></div>

注意需要输出父 div (..etc) 以及包装 span 标签...

帮助!

【问题讨论】:

    标签: php html dom


    【解决方案1】:

    我从来没有做过你想做的事,但是作为一个在黑暗中的刺,使用 API 文档,确实 echo $entry->textContent;工作吗?

    添加更新。这是来自 DOMNode 的文档页面上的 cmets:

    嗨!

    结合所有的cmets,最简单的获取节点内部HTML的方法就是使用这个函数:

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

    或者,也许一个更简单的方法就是这样做:

    echo $domDocument->saveXML($entry);
    

    【讨论】:

    • 对不起,应该在帖子中包含这个,但在这里我找到了这个:php.net/manual/en/class.domnode.php textContent = "此属性返回此节点及其后代的文本内容。"
    • 不,这与 nodeValue 的作用相同
    • 根据文档中的评论,遍历是获取innerHTML的最佳方式。让我知道这是否适合您。
    • 我没有测试你发布的代码,但我发现了这个function innerXML($node) { $doc = $node-&gt;ownerDocument; $frag = $doc-&gt;createDocumentFragment(); foreach ($node-&gt;childNodes as $child) { $frag-&gt;appendChild($child-&gt;cloneNode(TRUE)); } return $doc-&gt;saveXML($frag); } ,它可以工作。谢谢!
    • 酷,我不确定我是否有多大帮助,但希望至少可以为您指明正确的方向。
    【解决方案2】:

    代替:

    echo $entry->nodeValue;
    

    你必须使用:

    echo $doc->saveXML($entry);
    

    这是一个更完整的示例,可能对其他人也有帮助,$doccontent 是作为字符串的 HTML 块:

    $doccontent = '<html> …'; // your html string
    $dom = new DOMDocument;
    $internalErrors = libxml_use_internal_errors(true); // prevent error messages 
    $content_utf = mb_convert_encoding($doccontent, 'HTML-ENTITIES', 'UTF-8'); // correct parsing of utf-8 chars
    $dom->loadHTML($content_utf);
    libxml_use_internal_errors($internalErrors); // prevent error messages 
    $specialdiv = $dom->getElementById('xdiv');
    if(isset($specialdiv))
    {
        echo $dom->saveXML($specialdiv);
    }
    

    【讨论】:

    • 在 2018 年之前非常有用!
    猜你喜欢
    • 2013-07-11
    • 2011-12-13
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 2011-10-07
    • 2016-08-03
    相关资源
    最近更新 更多