2010-06-29 9 views
9

मैं एक HTML टेम्पलेट लोड करने, इसे संशोधित करने और इसे आउटपुट करने के लिए PHP के DOM का उपयोग कर रहा हूं। हाल ही में मैंने पाया कि स्वयं बंद (खाली) टैग में एक समापन स्लैश शामिल नहीं है, भले ही टेम्पलेट फ़ाइल ने किया हो।PHP डॉम में स्वयं बंद टैग पर स्लैश क्यों शामिल नहीं है?

उदा।

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"`"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
</head> 
<body> 
</body> 
</html> 

हो जाता है:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
</head> 
<body> 
</body> 
</html> 

यह एक बग या एक सेटिंग है, या एक doctype मुद्दा है?

+0

क्या आपने यह देखने के लिए एक डॉक्टरेट जोड़ने की कोशिश की है कि क्या होता है? – ceejayoz

+0

मैं हमेशा एक एक्सएचटीएमएल डॉक्ट टाइप का उपयोग कर रहा हूं, सोचा कि यह प्रासंगिक नहीं था क्योंकि मैं थक गया हूं-_- – peterjwest

उत्तर

19

DOMDocument->saveHTML() आपके एक्सएमएल डोम इंफोसेट लेता है और इसे पुराने स्कूल HTML के रूप में लिखता है, एक्सएमएल नहीं। आपको saveHTML() का उपयोग एक्सएचटीएमएल डक्ट टाइप के साथ नहीं करना चाहिए, क्योंकि इसका आउटपुट अच्छी तरह से एक्सएमएल नहीं होगा।

यदि आप इसके बजाय saveXML() का उपयोग करते हैं, तो आपको उचित एक्सएचटीएमएल मिलेगा। यदि आप इसे Content-Type: application/xhtml+xml शीर्षलेख देते हैं तो यह XML आउटपुट मानकों-अनुरूप ब्राउज़र पर सेवा करना ठीक है। लेकिन दुर्भाग्य से आईई 6-8 इसे पढ़ने में सक्षम नहीं होगा, क्योंकि वे अभी भी text/html मीडिया प्रकार के तहत पुराने स्कूल HTML को संभाल सकते हैं।

सामान्य समझौता समाधान text/html की सेवा करना है और एक्सएचटीएमएल 1.0 spec के परिशिष्ट सी में उल्लिखित 'एचटीएमएल-संगत एक्सएचटीएमएल' का उपयोग करना है। लेकिन दुख की बात है कि इसके लिए सही आउटपुट उत्पन्न करने के लिए कोई PHP DOMDocument->saveXHTML() विधि नहीं है।

कुछ सामान्य मामलों के लिए HTML- संगत आउटपुट बनाने के लिए saveXML() को मनाने के लिए कुछ चीजें हैं जो आप कर सकते हैं। मुख्य बात यह है कि आपको यह सुनिश्चित करना होगा कि HTML4 द्वारा EMPTY सामग्री मॉडल (<img>, <br> आदि) के रूप में परिभाषित केवल तत्वों में वास्तव में खाली सामग्री हो, जिससे स्वयं-समापन वाक्यविन्यास (<img/>) का उपयोग किया जा सके। अन्य तत्वों, स्वयं बंद होने सिंटैक्स का उपयोग नहीं होना चाहिए, इसलिए यदि वे खाली कर रहे हैं आप अपने पाठ्य सामग्री में एक अंतरिक्ष डाल उन्हें ऐसा किया जा रहा रोकने के लिए चाहिए: एक दूसरे के लिए की हैंडलिंग है बाहर देखने के लिए

<script src="x.js"/>   <-- no good, confuses HTML parser and breaks page 
<script src="x.js"> </script> <-- fine 

इनलाइन <script> और <style> तत्व, जो एक्सएचटीएमएल में सामान्य तत्व हैं लेकिन विशेष CDATA- HTML में सामग्री तत्व। कुछ /*<![CDATA[*/.../*]]>*/ रैपिंग को < या & उनके अंदर वर्णों को अधिकतर लगातार व्यवहार करने की आवश्यकता है, हालांकि ध्यान दें कि आपको अभी भी ]]> और </ अनुक्रमों से बचना है।

यदि आप वास्तव में इसे सही तरीके से करना चाहते हैं तो आपको अपना स्वयं का HTML- संगत-एक्सएचटीएमएल धारावाहिक लिखना होगा। दीर्घकालिक जो शायद एक बेहतर विकल्प होगा। लेकिन छोटे साधारण मामलों के लिए, अपने इनपुट को हैक करना ताकि इसमें कुछ भी शामिल न हो जो एक्सएमएल सीरियलिसर के दूसरे छोर से बाहर आ जाए क्योंकि एचटीएमएल के साथ असंगत शायद त्वरित समाधान है।

यह या बस इसे चूसो और पुराने स्कूल गैर-एक्सएमएल एचटीएमएल के साथ रहें, जाहिर है।

+0

विस्तृत उत्तर के लिए धन्यवाद। मैंने हमेशा PHP के डोम से नफरत की है, हालांकि यह ताबूत पर टुकड़ा है। मैं saveXML() के साथ इनपुट/आउटपुट को बदलने के लिए कुछ सरल रेगेक्स प्री/पोस्ट प्रोसेसिंग का प्रयास कर सकता हूं। यह एक आदर्श समाधान नहीं है। क्या PHP का डोम HTML 5 का समर्थन करता है? – peterjwest

+0

सभी लागतों पर रीगेक्स-हैकिंग आउटपुट एचटीएमएल से बचें। (लेकिन मैं कहूंगा कि, क्या मैं नहीं?) एक एक्सएचटीएमएल सीरियलाइज़र लिखना बुरा नहीं है (एक्सएमएल धारावाहिक के लिए रास्ता आसान है); यह धीमा होगा, लेकिन फिर 'DOMDocument' के साथ टेम्पलेट तैयार करना सामान्य रूप से बहुत धीमा है। एचटीएमएल 5 के रूप में, यह प्रभावी ढंग से HTML4 के समान काम करेगा। PHP को नए HTML5 तत्वों के बारे में पता नहीं है, इसलिए यदि आपने किसी भी 'ईएमपीटीई' (उदाहरण के लिए ' ') का उपयोग किया है तो आपको उनके लिए एक अवैध अंत टैग मिलेगा। – bobince

+0

ओह वाह, [आप करेंगे] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) कहें। क्या आप PHP में टेम्पलेट्स (HTML या XHTML) तैयार करने का एक तेज़ तरीका जानते हैं? – peterjwest

2

doctype मुद्दा यह है के रूप में पाठ/html समापन स्लैश की जरूरत नहीं है, आप केवल बंद करने स्लैश जरूरत है अगर यह एक एक्सएचटीएमएल डॉक

विख्यात आप doctype में जोड़ने के लिए अपडेट कर लिया है, लेकिन पीएचपी डोम भी लग रहा है उस मेटा टैग पर आपको वहां मिला है, और सामग्री = "टेक्स्ट/एचटीएमएल; वर्णसेट = यूटीएफ -8" स्पष्ट रूप से एक्सएमएल आधारित नहीं है, यह सिर्फ टेक्स्ट/एचटीएमएल है :)

एक तरफ: डोम एपीआई भी उठाता है वहां से वर्णमाला

+1

मुझे अभी भी समझ में नहीं आता है कि लोग एक्सएचटीएमएल डॉक्ट टाइप का उपयोग क्यों करते हैं - खासकर जब वे सामग्री-प्रकार के टेक्स्ट/एचटीएमएल का उपयोग करते हैं आईई में अपनी साइट को ठीक से काम कर रहे हैं ... 99% वेब के लिए, xhtml इसे अनुचित रूप से कार्यान्वित करने की लागत पर HTML4.01 पर कोई लाभ नहीं देता है (जैसे सामग्री-प्रकार = टेक्स्ट/एचटीएमएल) – HorusKol

+0

xhtml एक्सएमएल टूल चेन संगत है, और एक्सएमएल टूलिंग में एक बड़ा निवेश रहा है, इससे ब्राउज़र में कोई फर्क नहीं पड़ता है, लेकिन यह सुनिश्चित करता है कि कई अन्य ग्राहकों और जेनरेटर (विशेष रूप से यदि आप मिश्रण में xslt आदि जोड़ते हैं) – nathan

-1

यह एक पुरानी सवाल है, लेकिन ...
के रूप में अन्य के कहा है, पीएचपी के डोम वांछित होने के लिए बहुत ...
यहाँ एक रेगुलर एक्सप्रेशन "शून्य" टैग बंद करने के लिए है अगर आप ऐसा चाहते हैं छोड़ देता है

$voidTags = array('area','base','br','col','command','embed','hr','img','input','keygen','link','meta','param','source','track','wbr'); 
$regEx = '#<('.implode('|', $voidTags).')(\b[^>]*)>#'; 
$html = preg_replace($regEx, '<\\1\\2 />', $html); 
+0

कुछ समस्याएं प्रतीत होती थीं। मैंने इसे संशोधित किया और यह मेरे लिए काम किया: '$ regEx = '# <\ b ('। Implode ('|', $ voidTags)।) ([^>] +)><\/\b\1> #g ';' – user594044

संबंधित मुद्दे