如何在使用DOM解析时保持HTML格式完整 - (无标记剥离)

时间:2013-06-12 12:05:14

标签: php dom html-parsing domdocument

使用DOMDocument,我正在尝试读取HTML文件的一部分,并使用下面的代码将其显示在不同的HTML页面上。我正在尝试访问的DIV部分有几个<p>标记。问题是当DOM解析文件时,它只获取<p>标签 - 条带标签之间的文本内容 - 并且段落格式丢失。它合并文本并将它们全部显示为一个段落。如何保持HTML格式以便段落显示在源文件中?

HTML代码

<div class="text_container">
<h3>Title</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing eli. 
Lorem ipsum dolor sit amet, consectetur adipiscing eli.</p>     

<p>Lorem ipsum dolor sit amet, consectetur adipiscing eli. 
Lorem ipsum dolor sit amet, consectetur adipiscing eli.</p>

<p>Lorem ipsum dolor sit amet, consectetur adipiscing eli. 
Lorem ipsum dolor sit amet, consectetur adipiscing eli.</p>

DOMDocumnet代码

<?php

$page = file_get_contents('word.php');
$doc = new DOMDocument();
$doc -> loadHTML($page);
$divs = $doc->getElementsByTagName('div');
foreach($divs as $div) {
    if ($div->getAttribute('class') === 'text_container') {
         echo '<p>',$div->nodeValue,'</p>';

    }

?>

1 个答案:

答案 0 :(得分:2)

您可以定义自定义函数DOMinnerHTML()(描述为here)以检索元素的内部HTML,而不是文本内容。它通过temorarlily创建一个新文档:

<?php 
function DOMinnerHTML($element) 
{ 
    $innerHTML = ""; 
    $children = $element->childNodes; 
    foreach ($children as $child) 
    { 
        $tmp_dom = new DOMDocument(); 
        $tmp_dom->appendChild($tmp_dom->importNode($child, true)); 
        $innerHTML.=trim($tmp_dom->saveHTML()); 
    } 
    return $innerHTML; 
} 
?> 

使用示例:

$doc = new DOMDocument();
$doc -> loadHTML($page);
$divs = $doc->getElementsByTagName('div');
foreach($divs as $div) {
    if ($div->getAttribute('class') === 'text_container') {
        $innerHtml = DOMinnerHTML($div);
        echo '<div>' . $innerHtml . '</div>';
    }
}