PHP DOM获取节点值html?(无剥离标签)

PHP DOM获取节点值html?(无剥离标签),php,html,dom,Php,Html,Dom,我试图使用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 cl

我试图使用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>
text
文本文本文本
文本文本文本
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;
        }
$file=file\u获取内容('file.txt');
$doc=新的DOMDocument();
@$doc->loadHTML('.$file);
$entries=$doc->getElementsByTagName('div');
对于($i=0;$i长度;$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>
text
文本文本文本
文本文本文本
请注意,需要输出父div(…etc)以及包装span标记


救命啊

我从来没有做过你想做的事,但作为一种暗中操作,使用API文档,echo$entry->textContent;工作

添加更新。这来自文档页面上的注释,用于:

结合所有th注释,获取节点内部HTML的最简单方法是使用以下函数:

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

    return $innerHTML;  }  ?>
而不是:

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);
}
$doccontent='…';//您的html字符串
$dom=新的DOMDocument;
$internalErrors=libxml_使用_内部_错误(true);//防止错误消息
$content\u utf=mb\u convert\u编码($doccontent,'HTML-ENTITIES','utf-8');//utf-8字符的正确解析
$dom->loadHTML($content\u utf);
libxml_使用内部错误($internalErrors);//防止错误消息
$specialdiv=$dom->getElementById('xdiv');
如果(isset($specialdiv))
{
echo$dom->saveXML($specialdiv);
}

很抱歉,应该在帖子中包含此内容,但我在这里找到了:textContent=“此属性返回此节点及其子节点的文本内容。”不,这与NodeValue的功能相同根据文档中的注释,遍历是获取innerHTML的最佳方式。让我知道这是否对你有效。我没有测试你发布的代码,但我发现了这个
函数innerXML($node){$doc=$node->ownerDocument;$frag=$doc->createDocumentFragment();foreach($node->childNodes as$child){$frag->appendChild($child->cloneNode(TRUE));}return$doc->saveXML($frag);}
,它可以工作。谢谢很酷,我不确定我帮了多少忙,但希望,至少,为你指明了正确的方向。在2018年之前非常有用!
$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);
}