从DOM文档访问标记的内部html

时间:2014-08-17 09:26:26

标签: html parsing domdocument innerhtml

我试图从一个html文件中获取一些内容,并使用php将该内容加载到另一个html文件中。我已经将第一个html文件加载为DOMdocument。现在我想将内容放在该加载的html文件的某个标记内。我在互联网上搜索了解决方案,但我只能找到获取标签内容值的方法。我想获取给定标签内的所有内容。即包括内部html标签。我该怎么办?

我有一个像这样的html文件:

<html>
<head>
</head>
<body>
</body>
<p>
<h1> hi </h1>
</p>
</html>

使用此html文件创建domdocument。现在我想做的是获取内容:

    <p>
    <h1> hi </h1>
    </p>

作为一个字符串。

简而言之,我需要的功能类似于:

 $doc->getElementsByTagName('p').item(0).innerHTML;

这里$ doc是一个DomDocument。

$doc = new DomDocument;
$doc->Load('test.html');

2 个答案:

答案 0 :(得分:0)

手册中的这条评论可能会对您有所帮助:

http://php.net/manual/en/book.dom.php#89718

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

Example:

<?php
$dom= new DOMDocument();
$dom->load($html_string);
$dom->preserveWhiteSpace = false;

$domTable = $dom->getElementsByTagName("table");

foreach ($domTable as $tables)
{
    echo DOMinnerHTML($tables);
}
?>

更新:

btw:h*标记在p标记内无效。例如,在firebug中,您会看到firefox会自动关闭h标记之前的p标记,然后再将其打开。

答案 1 :(得分:0)

获取DOM节点内部HTML的最简单方法是(如果您不介意修改原始文档)是创建一个新的DOMDocumentFragment并将子节点移动到其中:

<?php

$html = '<body><p><span> hi </span></p></body>';

$doc = new DOMDocument();
$doc->loadHTML($html);

$p = $doc->getElementsByTagName('p')->item(0);

$fragment = $doc->createDocumentFragment();

while ($p->firstChild) {
  $fragment->appendChild($p->firstChild);
}

print $doc->saveHTML($fragment); // <span> hi </span>