如何使用 PHP 的 DOMDocument 获取元素的序列化 HTML?

Posted

技术标签:

【中文标题】如何使用 PHP 的 DOMDocument 获取元素的序列化 HTML?【英文标题】:How can I get an element's serialised HTML with PHP's DOMDocument? 【发布时间】:2011-04-17 20:09:24 【问题描述】:

这是我的示例脚本:

$html = <<<HTML
<div class="main">
    <div class="text">
    Capture this text 1
    </div>
    <div class="date">
    May 2010
    </div>
</div>
<div class="main">
    <div class="text">
    Capture this text 2
    </div>
    <div class="date">
    June 2010
    </div>
</div>
HTML;

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

$xpath = new DOMXPath($dom);


$tags = $xpath->query('//div[@class="main"]');
foreach ($tags as $tag) 
    print_r($tag->nodeValue."\n");

这将输出:

Capture this text 1 May 2010
Capture this text 2 June 2010 

但我需要它输出:

<div class="text">
Capture this text 2
</div>
<div class="date">
June 2010
</div>

或者至少可以在我的 foreach 循环中做这样的事情:

$text = $tag->query('//div[@class="text"]')->nodeValue;
$date = $tag->query('//div[@class="date"]')->nodeValue;

【问题讨论】:

这个问题不是关于XPath表达式,而是关于具体的DOM实现方法。 【参考方案1】:

好吧,nodeValue 会给你节点的值。你想要通常所说的outerHTML

echo $dom->saveXml($tag);

将以符合 X(HT)ML 的方式输出您要查找的内容。


php 5.3.6 开始,您还可以将节点传递给 saveHtml、which wasnt possible previously:

echo $dom->saveHtml($tag);

后者将遵循 HTML4 语法。感谢Artefacto。

【讨论】:

将此与 JapanPro 对innerHTML 的回答结合起来,我们可以将$result = '';foreach($tag-&gt;childNodes as $tag) $result.=$dom-&gt;saveXML($tag); 与原始XPath 结合起来。【参考方案2】:

试试这个

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

$xpath = new DOMXPath($dom);

$tags = $xpath->query('//div[@class="main"]');

foreach ($tags as $tag) 
    $innerHTML = '';

    $children = $tag->childNodes;
    foreach ($children as $child) 
        $tmp_doc = new DOMDocument();
        $tmp_doc->appendChild($tmp_doc->importNode($child,true));       
        $innerHTML .= $tmp_doc->saveHTML();
    

    var_dump(trim($innerHTML));

-帕斯卡·马丁

【讨论】:

为什么投了反对票,没有测试代码。在投票时也留下一些反馈。 为什么要归功于 Pascal Martin?你从他的一个答案中得到了密码吗? @Pascal 我认为不鼓励在这里复制和粘贴其他用户的答案。 @alex 似乎很大程度上基于我在那里给出的部分答案:***.com/q/2574625/138475 (我必须删除/重新发布我的评论才能编辑它一点)

以上是关于如何使用 PHP 的 DOMDocument 获取元素的序列化 HTML?的主要内容,如果未能解决你的问题,请参考以下文章

使用 DOMDocument PHP 获取 Xpath 父节点?

如何在 PHP 中将 XML 字符串转换为 DOMDocument?

PHP DOMDocument - 获取 BODY 的 html 源代码

PHP DOMDocument 添加了额外的标签

PHP DOMDocument获取标签的属性

如何防止 PHP 的 DOMDocument 编码 html 实体?