【问题标题】:How to Keep HTML Formatting Intact When Parsing with DOM - (No Tag Stripping)使用 DOM 解析时如何保持 HTML 格式完整 - (无标签剥离)
【发布时间】:2013-06-08 12:57:09
【问题描述】:

使用 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>';

    }

?>

【问题讨论】:

    标签: php dom html-parsing domdocument


    【解决方案1】:

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

    <?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>';
        }
    }
    

    【讨论】:

    • 是否可以去掉

      标签只显示没有标题的段落?

    • @Infinity 当然。您需要更深一层(进入 div)。然后,您可以以任何您喜欢的方式过滤您想要的标签。
    猜你喜欢
    • 2011-05-18
    • 2011-09-11
    • 2016-05-16
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 2011-05-08
    • 2013-07-11
    • 1970-01-01
    相关资源
    最近更新 更多