Bạn sử dụng chức năng nào để nhận được innerHTML của một DOMNode đã cho trong triển khai PHP DOM? Ai đó có thể đưa ra giải pháp đáng tin cậy?Cách lấy innerHTML của DOMNode?
Tất nhiên bên ngoàiHTML cũng sẽ làm.
Bạn sử dụng chức năng nào để nhận được innerHTML của một DOMNode đã cho trong triển khai PHP DOM? Ai đó có thể đưa ra giải pháp đáng tin cậy?Cách lấy innerHTML của DOMNode?
Tất nhiên bên ngoàiHTML cũng sẽ làm.
Compare biến thể này được cập nhật với PHP Manual User Note #89718:
<?php
function DOMinnerHTML(DOMNode $element)
{
$innerHTML = "";
$children = $element->childNodes;
foreach ($children as $child)
{
$innerHTML .= $element->ownerDocument->saveHTML($child);
}
return $innerHTML;
}
?>
Ví dụ:
<?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);
}
?>
function setnodevalue($doc, $node, $newvalue){
while($node->childNodes->length> 0){
$node->removeChild($node->firstChild);
}
$fragment= $doc->createDocumentFragment();
$fragment->preserveWhiteSpace= false;
if(!empty($newvalue)){
$fragment->appendXML(trim($newvalue));
$nod= $doc->importNode($fragment, true);
$node->appendChild($nod);
}
}
Trả lại html
của một phần tử, bạn có thể sử dụng C14N():
$dom = new DOMDocument();
$dom->loadHtml($html);
$x = new DOMXpath($dom);
foreach($x->query('//table') as $table){
echo $table->C14N();
}
C14N sẽ cố chuyển đổi HTML thành một XML hợp lệ. Ví dụ:
sẽ trở thành
–
ajaybc
Đó là cách bẩn để kết xuất HTML của phần tử, mà không phải sử dụng saveHTML để xuất ra các thẻ html, head và body. –
Một phiên bản đơn giản của câu trả lời Haim Evgi của:
<?php
function innerHTML(\DOMElement $element)
{
$doc = $element->ownerDocument;
$html = '';
foreach ($element->childNodes as $node) {
$html .= $doc->saveHTML($node);
}
return $html;
}
Ví dụ sử dụng:
<?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>
*/
Không cần thiết preserveWhiteSpace
hoặc formatOutput
.
Đây là một phiên bản trong một lập trình chức năng phong cách:
function innerHTML($node) {
return implode(array_map([$node->ownerDocument,"saveHTML"],
iterator_to_array($node->childNodes)));
}
Ngoài phiên bản đẹp trincot với array_map
và implode
nhưng lần này với array_reduce
:
return array_reduce(
iterator_to_array($node->childNodes),
function ($carry, \DOMNode $child) {
return $carry.$child->ownerDocument->saveHTML($child);
}
);
vẫn không hiểu, tại sao không có phương thức reduce()
nào chấp nhận các mảng và trình lặp.
Cảm ơn. Nó hoạt động tốt. Không nên $ dom-> preserveWhiteSpace = false; trước khi tải tài liệu? – JohnM2
@ JohnM2: [Có nên] (http://stackoverflow.com/questions/798967/php-simplexml-how-to-save-the-file-in-a-formatted-way). – hakre
Ghi chú bổ sung: Vì PHP 5.3.6 bạn có thể sử dụng 'DOMDocument' tạm thời. Cũng có thể muốn thay thế 'trim' bằng' ltrim' (hoặc thậm chí loại bỏ nó hoàn toàn) để bảo toàn một chút khoảng trống như ngắt dòng. – hakre