2009-04-20 11 views
27

मैं कुछ एचटीएमएल दस्तावेज़ बनाने के लिए PHP में डीओएम एक्सटेंशन का उपयोग कर रहा हूं, और मैं चाहता हूं कि आउटपुट अच्छी तरह से स्वरूपित किया जाए (नई लाइनों और इंडेंटेशन के साथ) ताकि यह पठनीय हो सके, हालांकि , कई परीक्षणों से मेरे द्वारा की गई:PHP "सुंदर प्रिंट" एचटीएमएल (टिडी नहीं)

  1. "formatOutput = सच" saveHTML(), केवल saveXML() के साथ बिल्कुल भी काम नहीं करता है
  2. यहां तक ​​कि अगर मैं saveXML() का इस्तेमाल किया, यह अभी भी केवल डीओएम के माध्यम से बनाए गए तत्वों पर काम करता है, न कि तत्वों को लोड HTML() के साथ शामिल किया गया है, यहां तक ​​कि "preserveWhiteSpace = false"

यदि कोई अलग से जानता है तो मैं वास्तव में जानना चाहता हूं कि उन्हें यह कैसे काम करने के लिए मिला।

तो, मेरे पास एक डोम दस्तावेज़ है, और मैं HTML को आउटपुट करने के लिए saveHTML() का उपयोग कर रहा हूं। चूंकि यह डोम से आ रहा है, मुझे पता है कि यह मान्य है, किसी भी तरह से "साफ" करने या इसे सत्यापित करने की कोई आवश्यकता नहीं है।

मैं बस डीओएम एक्सटेंशन से प्राप्त आउटपुट से अच्छी तरह से स्वरूपित आउटपुट प्राप्त करने का एक तरीका ढूंढ रहा हूं।

एनबी। जैसा कि आपने अनुमान लगाया होगा, मैं टिडी एक्सटेंशन को ए के रूप में उपयोग नहीं करना चाहता हूं) यह बहुत अधिक है कि मुझे इसकी भी आवश्यकता है (मार्कअप पहले से ही मान्य है) और बी) यह वास्तव में HTML सामग्री में परिवर्तन करता है (जैसे कि एचटीएमएल 5 डॉक्टरेट और कुछ तत्व)।

फ़ॉलो अप:

ठीक है, इस सवाल का जवाब की मदद से नीचे मैं बाहर काम किया है क्यों डोम विस्तार से काम नहीं कर रहा था। हालांकि दिया गया उदाहरण काम करता है, फिर भी यह मेरे कोड के साथ काम नहीं कर रहा था। this टिप्पणी की सहायता से मैंने पाया कि यदि आपके पास कोई टेक्स्ट नोड्स है जहां हैइट्सपेसइनइलेमेंटकंटेंट() सत्य है तो उस बिंदु से परे कोई स्वरूपण लागू नहीं किया जाएगा। यह चाहे भरोसा करता है कि व्हाइटस्पेस गलत है या नहीं। समाधान इन सभी नोड्स को निकालना है (हालांकि मुझे यकीन नहीं है कि इससे वास्तविक सामग्री पर प्रतिकूल प्रभाव पड़ सकता है)।

उत्तर

29

आप सही हैं, एचटीएमएल (others are also confused) के लिए कोई इंडेंटेशन नहीं है। एक्सएमएल काम करता है, यहां तक ​​कि लोड कोड के साथ भी।

<?php 
function tidyHTML($buffer) { 
    // load our document into a DOM object 
    $dom = new DOMDocument(); 
    // we want nice output 
    $dom->preserveWhiteSpace = false; 
    $dom->loadHTML($buffer); 
    $dom->formatOutput = true; 
    return($dom->saveHTML()); 
} 

// start output buffering, using our nice 
// callback function to format the output. 
ob_start("tidyHTML"); 

?> 
<html> 
    <head> 
    <title>foo bar</title><meta name="bar" value="foo"><body><h1>bar foo</h1><p>It's like comparing apples to oranges.</p></body></html> 
<?php 
// this will be called implicitly, but we'll 
// call it manually to illustrate the point. 
ob_end_flush(); 
?> 

परिणाम:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html> 
<head> 
<title>foo bar</title> 
<meta name="bar" value="foo"> 
</head> 
<body> 
<h1>bar foo</h1> 
<p>It's like comparing apples to oranges.</p> 
</body> 
</html> 

saveXML() के साथ एक ही ...

<?xml version="1.0" standalone="yes"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html> 
    <head> 
    <title>foo bar</title> 
    <meta name="bar" value="foo"/> 
    </head> 
    <body> 
    <h1>bar foo</h1> 
    <p>It's like comparing apples to oranges.</p> 
    </body> 
</html> 

शायद preserveWhiteSpace = loadHTML से पहले झूठी सेट करने के लिए भूल गए?

अस्वीकरण: मैंने tyson clugg/php manual comments से अधिकांश डेमो कोड चुरा लिया। आलसी मुझे


अद्यतन: मैं अब कुछ साल पहले याद मैं एक ही बात करने की कोशिश की है और एक ही समस्या में पड़ गए। मैंने इसे एक गंदे कामकाज को लागू करके तय किया (प्रदर्शन महत्वपूर्ण नहीं था): जब तक समस्या गायब हो गई, तब तक मैंने किसी भी तरह SimpleXML और DOM के बीच परिवर्तित नहीं किया। मुझे लगता है कि रूपांतरण उन नोड्स से छुटकारा पा लिया।हो सकता है कि डोम के साथ लोड हो, simplexml_import_dom के साथ आयात करें, फिर स्ट्रिंग आउटपुट करें, इसे फिर से डीओएम के साथ पार्स करें और फिर इसे सुंदर मुद्रित करें। जहां तक ​​मुझे याद है कि यह काम करता है (लेकिन यह वास्तव में धीमा था)।

+0

धन्यवाद। Php.net पर आपके उदाहरणों और टिप्पणियों के साथ मैंने समस्या का समाधान किया है (उपरोक्त अनुवर्ती देखें)। –

+0

डोम के साथ समाधान मुझे काफी हेवीवेट लगता है। यह कितनी तेज़ या धीमी है? छोटे स्निपेट पर या केवल पूरे पृष्ठ पर इसका उपयोग करना उचित है? – sumid

+0

'saveXML()' का उपयोग करते समय कुछ टैग्स के साथ 'savexa टाइप = "टेक्स्ट" name = "name">' के साथ 'saveXML()' का उपयोग करते समय एक समस्या है, यह इसे '