如何获得DOMNode的innerHTML?

Daw*_*hia 92 php dom innerhtml

在PHP DOM实现中,您使用什么函数来获取给定DOMNode的innerHTML?有人能给出可靠的解决方案

当然,outerHTML也会这样做.

Hai*_*vgi 147

比较与此更新变种PHP手册用户注意#89718:

<?php 
function DOMinnerHTML(DOMNode $element) 
{ 
    $innerHTML = ""; 
    $children  = $element->childNodes;

    foreach ($children as $child) 
    { 
        $innerHTML .= $element->ownerDocument->saveHTML($child);
    }

    return $innerHTML; 
} 
?> 
Run Code Online (Sandbox Code Playgroud)

例:

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

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

// Iterate over DOMNodeList (Implements Traversable)
foreach ($domTables as $table) 
{ 
    echo DOMinnerHTML($table); 
} 
?> 
Run Code Online (Sandbox Code Playgroud)

  • 我必须更改函数声明以期望一个`DOMElement`而不是`DOMNode`,因为我从`DOMDocument :: getElementById()`传递了返回.以防它绊倒其他人. (3认同)
  • 附加说明:从 PHP 5.3.6 开始,您可以保留临时的“DOMDocument”。另外,人们可能想用“ltrim”替换“trim”(甚至完全删除它)以保留一些空白,例如换行符。 (2认同)

tri*_*cot 23

这是一个函数式编程风格的版本:

function innerHTML($node) {
    return implode(array_map([$node->ownerDocument,"saveHTML"], 
                             iterator_to_array($node->childNodes)));
}
Run Code Online (Sandbox Code Playgroud)

  • 但我们希望有一个人类可读的虚拟变体:) (4认同)

Ped*_*ito 12

要返回html元素,可以使用C14N():

$dom = new DOMDocument();
$dom->loadHtml($html);
$x = new DOMXpath($dom);
foreach($x->query('//table') as $table){
    echo $table->C14N();
}
Run Code Online (Sandbox Code Playgroud)

  • C14N将尝试将HTML转换为有效的XML.例如,<br>将成为<br> </ br> (2认同)

Alf*_*ton 7

Haim Evgi的简化版答案:

<?php

function innerHTML(\DOMElement $element)
{
    $doc = $element->ownerDocument;

    $html = '';

    foreach ($element->childNodes as $node) {
        $html .= $doc->saveHTML($node);
    }

    return $html;
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

<?php

$doc = new \DOMDocument();
$doc->loadHTML("<body><div id='foo'><p>This is <b>an <i>example</i></b> paragraph<br>\n\ncontaining newlines.</p><p>This is another paragraph.</p></div></body>");

print innerHTML($doc->getElementById('foo'));

/*
<p>This is <b>an <i>example</i></b> paragraph<br>

containing newlines.</p>
<p>This is another paragraph.</p>
*/
Run Code Online (Sandbox Code Playgroud)

没有必要设置preserveWhiteSpaceformatOutput.


flu*_*flu 5

除了 trincot 的不错版本之外,还带有array_map和 ,implode但这次带有array_reduce

return array_reduce(
   iterator_to_array($node->childNodes),
   function ($carry, \DOMNode $child) {
        return $carry.$child->ownerDocument->saveHTML($child);
   }
);
Run Code Online (Sandbox Code Playgroud)

仍然不明白,为什么没有reduce()接受数组和迭代器的方法。