2010-01-18 39 views
72

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.

Trả lời

118

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); 
} 
?> 
+0

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

+0

@ JohnM2: [Có nên] (http://stackoverflow.com/questions/798967/php-simplexml-how-to-save-the-file-in-a-formatted-way). – hakre

+0

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

3
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); 
    } 
} 
6

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(); 
} 
+2

C14N sẽ cố chuyển đổi HTML thành một XML hợp lệ. Ví dụ:
sẽ trở thành

ajaybc

+0

Đó 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. –

3

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.

14

Đâ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))); 
} 
4

Ngoài phiên bản đẹp trincot với array_mapimplode 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ác vấn đề liên quan