2011-03-26 49 views
7

我正在通過DOMDocument類向每個鏈接添加#b哈希。php DOMDocument增加了<html>標題DOCTYPE聲明

 $dom = new DOMDocument(); 
     $dom->loadHTML($output); 

     $a_tags = $dom->getElementsByTagName('a'); 

     foreach($a_tags as $a) 
     { 
      $value = $a->getAttribute('href'); 
      $a->setAttribute('href', $value . '#b'); 
     } 

     return $dom->saveHTML(); 

這工作正常,但返回的輸出包括DOCTYPE聲明和一個<head><body>標籤。任何想法爲什麼發生這種情況,或者我可以如何防止這種情況?

+0

可能重複[PHP + DOM文檔:?outerHTML的元素(http://stackoverflow.com/questions/5404941/php-domdocument-externalhtml-for-element) – hakre 2013-07-03 05:00:40

回答

5

這就是DOMDocument::saveHTML()一般不,是:產生一個完整的HTML文檔,與DOCTYPE聲明,該<head>標籤,...

兩個可能的解決方案:

  • 如果您正在使用PHP工作> = 5.3,saveHTML()接受一個附加參數可能對您有所幫助
  • 如果你需要你的代碼PHP 5.3.6 <工作,你將不得不使用一些str_replace()或正則表達式或任何等同你能想到的去除的HTML代碼,你不需要的部分。
    • 有關示例,請參見手冊用戶註釋中的this note
+0

第二個鏈接適合我--preg_replace解決方案是關鍵!謝謝! – matt 2011-03-26 19:20:12

+2

不客氣:-) *(以及在手冊頁上發佈用戶註釋的人比我更感激,在這種情況下;-))* – 2011-03-26 19:21:10

+0

我使用第一個選項,因爲我使用PHP> = 5.3它運作得很好。 '$ doc-> saveHTML(false);' – 2013-10-21 07:29:53

1

添加$doc->saveHTML(false);不會工作,因爲它需要一個節點,而不是bool的它會返回一個錯誤。

溶液我使用:

return preg_replace('/^<!DOCTYPE.+?>/', '', str_replace(array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $doc->saveHTML()));

我真的使用PHP> 5.4

4

真正的問題是DOM被加載的方式。改爲: $html->loadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

請原文答覆here

0

我通過創建新的DOMDocument並將子節點從原始複製到新節點來解決此問題。

function removeDocType($oldDom) { 
    $node = $oldDom->documentElement->firstChild 
    $dom = new DOMDocument(); 
    foreach ($node->childNodes as $child) { 
    $dom->appendChild($doc->importNode($child, true)); 
    } 
    return $dom->saveHTML(); 
} 

所以insted的使用

return $dom->saveHTML(); 

的使用:

return removeDocType($dom);