2010-02-27 15 views
16

मैं PHP का उपयोग कर रहा हूँ DOMDocument loadHTML विधि का उपयोग कर सामग्री पार्स करने के लिए तो saveHTML के माध्यम से एक अच्छी तरह से गठित परिणाम हो रही पार्स करने और उपयोगकर्ताओं द्वारा जमा किए एचटीएमएल को सामान्य बनाने के HTML स्रोत मिलती है:पीएचपी DOMDocument - BODY

$dom= new DOMDocument(); 
$dom->loadHTML('<div><p>Hello World'); 
$well_formed= $dom->saveHTML(); 
echo($well_formed); 

यह टुकड़े को पार्स करने और उचित समापन टैग जोड़ने का एक सुंदर काम करता है। समस्या यह है कि मुझे टैग्स का एक गुच्छा भी मिल रहा है जो मैं नहीं चाहता हूं जैसे कि <!DOCTYPE>, <html>, <head> और <body>। मैं समझता हूं कि प्रत्येक अच्छी तरह से बनाए गए HTML दस्तावेज़ को इन टैग की आवश्यकता होती है, लेकिन HTML खंड जो मैं सामान्य कर रहा हूं उसे मौजूदा मान्य दस्तावेज़ में डाला जा रहा है।

उत्तर

3

अपने मामले में, आप एक HTML दस्तावेज़ के साथ काम नहीं करना चाहते हैं, लेकिन एक HTML खंड के साथ - HTML कोड का एक हिस्सा ;; जिसका अर्थ है कि DOMDocument आपको जो चाहिए वह बिल्कुल नहीं है।

इसके बजाय, मैं नहीं बल्कि तरह HTMLPurifier(के हवाले से) कुछ प्रयोग करेंगे:

एचटीएमएल शोधक मानकों का अनुपालन करने एचटीएमएल फिल्टर PHP में लिखा पुस्तकालय है। एचटीएमएल शोधक केवल सभी दुर्भावनापूर्ण कोड (बेहतर XSS के रूप में जाना जाता है) एक अच्छी तरह से लेखा परीक्षा के साथ को नहीं निकाला जाएगा, सुरक्षित अभी तक अनुमोदक श्वेत सूची, यह भी सुनिश्चित करें कि आपके दस्तावेजों मानकों के अनुरूप, कुछ केवल एक व्यापक साथ प्राप्त कर रहे हैं कर देगा डब्ल्यू 3 सी के विनिर्देशों का ज्ञान।

और, यदि आप कोड के अपने हिस्से का प्रयास करें:

<div><p>Hello World 

the demo page of HTMLPurifier का उपयोग करके आप एक आउटपुट के रूप में इस स्वच्छ HTML मिलती है:

<div><p>Hello World</p></div> 

बहुत बेहतर, है ना? ;-)

(ध्यान दें कि HTMLPurfier विकल्पों की एक विस्तृत श्रृंखला suppots, और इसके प्रलेखन पर एक नज़र डालने चोट नहीं हो सकता है कि)

+5

वहाँ अच्छी जानकारी यहाँ है, लेकिन मैं तर्क चाहते कि DOMDocument अभी भी एक कानूनी है इसके लिए उपकरण। "लोड HTML" विधि का अस्तित्व का तात्पर्य है कि DOMDocument HTML दस्तावेज़ों के साथ-साथ XML दस्तावेज़ों को पार्स करने के लिए है। PHP में लिखे गए HTMLPurifier या अन्य "सत्य" HTML पार्सर्स बहुत अच्छे हैं, लेकिन उनके perf। PHP ऑब्जेक्ट्स में निर्मित की तुलना में हमेशा पीला जा रहा है। –

+0

@Alan: मैं सहमत हूं कि HTML दस्तावेज़ों को पार्स करने की बात आती है जब DOMDocument बहुत अच्छा है ;;; लेकिन HTML भागों के लिए, विशेष रूप से ** उपयोगकर्ता द्वारा सबमिट ** के लिए, मेरा मानना ​​है कि HTMLPurifier एक बेहतर टूल है: यह उपयोगकर्ता द्वारा सबमिट किए गए HTML को फ़िल्टर करने के उद्देश्य से बनाया गया है - एक सुरक्षा बिंदु से * * (उदाहरण के लिए, DOMDocument XSS के बारे में परवाह नहीं है, जबकि HTMLPurifier करता है;; DOMDocument आपको यह निर्दिष्ट करने की अनुमति नहीं देता है कि HTMLPUrifier करता है, जबकि कौन से टैग/विशेषताओं की अनुमति होनी चाहिए) * –

22

आपकी समस्या का त्वरित समाधान हड़पने के लिए एक xPath अभिव्यक्ति का उपयोग करने के लिए है शरीर।

$dom= new DOMDocument(); 
$dom->loadHTML('<div><p>Hello World');  
$xpath = new DOMXPath($dom); 
$body = $xpath->query('/html/body'); 
echo($dom->saveXml($body->item(0))); 

यहां चेतावनी का एक शब्द। कभी-कभी लोड एचटीएमएल एक चेतावनी फेंक देगा जब यह निश्चित रूप से खराब रूप से खराब HTML दस्तावेज़ों का सामना करता है। यदि आप उन प्रकार के HTML दस्तावेज़ों को पार्स कर रहे हैं, तो आपको better html parser [स्वयं लिंक चेतावनी] ढूंढना होगा।

+3

यह [CONTENT] वापस आ जाएगा ... आप कैसे प्राप्त कर सकते हैं बस [सामग्री]? – farinspace

+1

आप हमेशा खोज कर सकते हैं और आउटपुट से पहले प्रतिस्थापित कर सकते हैं ... – farinspace

1

एक ही समस्या के साथ सामना करने के बाद, मैंने इसे और कुछ अन्य कमियों (जैसे एन्कोडिंग समस्याओं) को दूर करने के लिए SmartDOMDocument नामक DOMDocument के चारों ओर एक रैपर बनाया है।

आप इसे यहाँ पा सकते हैं: http://beerpla.net/projects/smartdomdocument

0

यह एक और पद से लिया और अपने प्रयोग के लिए पूरी तरह से काम किया गया था:

$layout = preg_replace('~<(?:!DOCTYPE|/?(?:html|head|body))[^>]*>\s*~i', '', $layout); 
+0

प्रासंगिक: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

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