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)
tri*_*cot 23
这是一个函数式编程风格的版本:
function innerHTML($node) {
return implode(array_map([$node->ownerDocument,"saveHTML"],
iterator_to_array($node->childNodes)));
}
Run Code Online (Sandbox Code Playgroud)
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)
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)
没有必要设置preserveWhiteSpace或formatOutput.
除了 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()接受数组和迭代器的方法。
| 归档时间: |
|
| 查看次数: |
83871 次 |
| 最近记录: |