2011-03-26 17 views
7

के साथ शीर्षलेख जोड़ता है मैं DOMDocument क्लास के माध्यम से प्रत्येक लिंक में # बी हैश जोड़ रहा हूं।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

संभव डुप्लिकेट [पीएचपी + DOMDocument: तत्व के लिए outerHTML] (http://stackoverflow.com/questions/5404941/php-domdocument-outerhtml-for-element) – hakre

उत्तर

5

DOMDocument::saveHTML() क्या आम तौर पर करता है हाँ, है कि:, उत्पन्न एक पूर्ण HTML दस्तावेज़ doctype घोषणा, <head> टैग के साथ ...

दो संभव समाधान:

  • आप PHP के साथ काम कर रहे हैं, तो > = 5.3, saveHTML() एक अतिरिक्त पैरामीटर स्वीकार करता है जो आपको
  • आप PHP < 5.3.6 के साथ काम करने के लिए अपने कोड की जरूरत है, तो आप एचटीएमएल कोड आप की जरूरत नहीं है के कुछ भागों को दूर करने के कुछ str_replace() या regex या जो कुछ भी बराबर आप सोच सकते हैं का उपयोग करना होगा।
    • उदाहरण के लिए, मैनुअल के उपयोगकर्ता नोट्स में this note देखें।
+0

दूसरा लिंक मेरे लिए ठीक काम करता है - preg_replace समाधान कुंजी है! धन्यवाद! – matt

+2

आपका स्वागत है :-) * (और जो लोग मैन्युअल पृष्ठों पर उपयोगकर्ताओं को पोस्ट करते हैं, उनके मुकाबले ज्यादा धन्यवाद किया जाता है, इस मामले में ;-)) * –

+0

मैंने पहले विकल्प का उपयोग किया क्योंकि मैं PHP> = 5.3 का उपयोग कर रहा हूं और यह बहुत अच्छा काम किया। '$ doc-> saveHTML (false);' –

1

$doc->saveHTML(false); जोड़ा जा रहा है काम नहीं करेगा और यह एक त्रुटि दिखाई देगी, क्योंकि यह एक नोड की उम्मीद है और bool नहीं।

समाधान मैं प्रयोग किया है:

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

मैं `PHP का उपयोग> 5.4

4

वास्तविक समस्या रास्ता डोम भरी हुई है है। इसके बजाए इसका उपयोग करें: $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(); 
} 

तो

return $dom->saveHTML(); 

का उपयोग कर के insted मैं का उपयोग करें:

return removeDocType($dom); 
की
संबंधित मुद्दे