2016-05-19 30 views
3

在這裏看到:https://ideone.com/bjs3IC的DomDocument解析換行可與跨度但不是的img

爲什麼換行正確地與span場顯示而不是img S'

<?php 
    outputImages(); 
    outputSpans(); 




    function outputImages(){ 
     $html = "<div class='test'> 
        <pre> 
        <img src='http://d...content-available-to-author-only...e.com/5x5/000/fff'> 
        <img src='http://d...content-available-to-author-only...e.com/5x5/000/fff'> 
        <img src='http://d...content-available-to-author-only...e.com/5x5/000/fff'> 
        </pre> 
       </div>"; 
     getHtml($html); 
    } 


    function outputSpans(){ 
     $html = "<div class='test'> 
        <pre> 
        <span>a</span> 
        <span>b</span> 
        <span>c</span> 
        </pre> 
       </div>"; 
     getHtml($html); 
    } 


    function getHtml($html){ 
     $doc = new DOMDocument; 
     $doc->loadhtml($html); 
     $xpath = new DOMXPath($doc); 
     $tags = $xpath->query('//div[@class="test"]'); 
     print(get_inner_html($tags[0])); 
    } 


    function get_inner_html($node) { 
     $innerHTML= ''; 
     $children = $node->childNodes; 
     foreach ($children as $child) { 
      $innerHTML .= $child->ownerDocument->saveXML($child); 
     } 

     return $innerHTML; 
    } 

回答

2

DOMDocument::loadHTML函數有第二個options參數。看起來像LIBXML_NOBLANKS是(至少一個)那裏的默認值。

您可以使用

$doc->loadhtml($html, LIBXML_NOEMPTYTAG); 

要覆蓋默認值,你的代碼將工作同爲兩個樣本。

p.s.
不知道爲什麼你使用

print(get_inner_html($tags[0])); 

$tags變量是DOMNodeList,所以你應該使用$tags->item(0)來獲得的第一個標籤。

你完整的代碼應該是這樣的:

outputImages(); 
outputSpans(); 

function outputImages() { 
    $html = "<div class='test'> 
       <pre> 
       <img src='http://d...content-available-to-author-only...e.com/5x5/000/fff'> 
       <img src='http://d...content-available-to-author-only...e.com/5x5/000/fff'> 
       <img src='http://d...content-available-to-author-only...e.com/5x5/000/fff'> 
       </pre> 
      </div>"; 
    getHtml($html); 
} 

function outputSpans() { 
    $html = "<div class='test'> 
       <pre> 
       <span>a</span> 
       <span>b</span> 
       <span>c</span> 
       </pre> 
      </div>"; 
    getHtml($html); 
} 

function getHtml($html) { 
    $doc = new DOMDocument; 
    $doc->loadHTML($html, LIBXML_NOEMPTYTAG); 
    $xpath = new DOMXPath($doc); 
    $tags = $xpath->query('//div[@class="test"]'); 
    print(get_inner_html($tags->item(0))); 
} 

function get_inner_html($node) { 
    $innerHTML= ''; 
    $children = $node->childNodes; 
    foreach ($children as $child) { 
     $innerHTML .= $child->ownerDocument->saveXML($child); 
    } 
    return $innerHTML; 
}