PHP

2010-02-28 3 views
8

में बुरी तरह से स्वरूपित HTML की पार्सिंग मेरे कोड में मैं कुछ स्टाइल xls दस्तावेज़ को ओपनऑफिस का उपयोग करके HTML में परिवर्तित करता हूं। मैं xml_parser_create का उपयोग कर तालिकाओं को पार्स करता हूं। समस्या यह है कि ओपनऑफिस अज्ञात <BR> और <HR> टैग के साथ पुरानेस्कूल एचटीएमएल बनाता है, यह सिद्धांतों को नहीं बनाता है और <TABLE WIDTH=4> गुणों को उद्धृत नहीं करता है।PHP

मुझे पता है कि PHP पार्सर्स इसे पसंद नहीं करते हैं, और एक्सएमएल स्वरूपण त्रुटियां उत्पन्न करते हैं। मेरा वर्तमान समाधान फ़ाइल पर कुछ regexes चलाने के लिए है इससे पहले कि मैं इसे पार्स करता हूं, लेकिन यह न तो अच्छा और न ही तेज़ है।

क्या आप एक (उम्मीदवार शामिल) php-parser जानते हैं, जो इस तरह की गलतियों की परवाह नहीं करता है? या शायद 'टूटा हुआ' एचटीएमएल तय करने का एक तेज़ तरीका?

उत्तर

8

एक समाधान "ठीक" करने के लिए टूटी हुई एचटीएमएल HTMLPurifier(के हवाले से) का उपयोग करने से हो सकता है देखें:

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


मानक हैं कर देगा एक वैकल्पिक विचार DOMDocument::loadHTML(के हवाले से) के साथ अपने HTML लोड करने का प्रयास करने के लिए हो सकता है:

फ़ंक्शन स्ट्रिंग स्रोत में HTML को निहित करता है। एक्सएमएल लोड करने के विपरीत, एचटीएमएल लोड करने के लिए अच्छी तरह से गठित नहीं होना चाहिए।

और यदि आप किसी फ़ाइल से HTML लोड करने का प्रयास कर रहे हैं, तो DOMDocument::loadHTMLFile देखें।

+0

+1। कोई भी http://simplehtmldom.sourceforge.net/ पर भी देख सकता है। – Alexar

+0

शोधक अच्छा है, लेकिन समस्या के लिए थोड़े ओवरकिल की तरह लगता है। DOMParser के लिए वही बात जाती है। क्या यह सही नहीं है, कि इसे एक सरल सैक्स पार्सर की तुलना में बहुत अधिक समय और राम की आवश्यकता होगी? –

+0

शायद इसे अधिक रैम, और संभवतः समय की आवश्यकता होगी; लेकिन यह एक साधारण SAX पार्स से अधिक करेगा, जो केवल डेटा पढ़ेगा, और इसकी मरम्मत नहीं करेगा ;;; और मैं कहूंगा कि एक सैक्स पार्सर केवल वैध एक्सएमएल पढ़ने में सक्षम होगा - जबकि HTMLPurifier और 'DOMDocument :: loadHTML' दोनों "टूटा हुआ" HTML पढ़ने में सक्षम हैं। –

4

वहाँ SimpleHTML

टूटा एचटीएमएल मरम्मत के लिए, आप Tidy इस्तेमाल कर सकते हैं है।

एक विकल्प के रूप में आप मूल XML Reader का उपयोग कर सकते हैं। चूंकि यह दस्तावेज़ स्ट्रीम पर आगे बढ़ने वाले कर्सर के रूप में कार्य करता है और रास्ते में प्रत्येक नोड पर रोकता है, यह अमान्य XML दस्तावेज़ों को तोड़ नहीं देगा।

http://www.ibm.com/developerworks/library/x-pullparsingphp.html

+1

+1 Tidy के लिए +1। मुझे लगता है कि यह सरल HTML से इसकी नौकरी पर अधिक मजबूत है। वास्तव में 2 अलग-अलग नौकरियों के लिए 2 अलग-अलग टूल्स। परिचय HTML35ifier के लिए – HappyTimeGopher

1

कोई विशेष कारण है कि आप अभी भी PHP 4 XML API का उपयोग कर रहे हैं?

यदि आप PHP 5 के XML API का उपयोग करने से दूर हो सकते हैं, तो दो संभावनाएं हैं।

सबसे पहले, अंतर्निहित HTML पार्सर आज़माएं। यह वास्तव में बहुत अच्छा नहीं है (यह खराब रूप से स्वरूपित एचटीएमएल पर चकित होता है), लेकिन यह चाल हो सकता है। DomDocument :: LoadHTML पर एक नज़र डालें।

दूसरा विकल्प - आप एचटीएमएल 5 पार्सर विनिर्देश के आधार पर HTML पार्सर की कोशिश कर सकते:

http://code.google.com/p/html5lib/

यह निर्मित पीएचपी HTML पार्सर की तुलना में बेहतर काम करने के लिए जाता है। यह HTML को DomDocument ऑब्जेक्ट में लोड करता है।

+0

मैं डोम पार्सर का उपयोग नहीं करना चाहता, क्योंकि दस्तावेज़ काफी बड़ा है। (और मैंने सैक्स के लिए पहले ही कोड लिखा है) –

0

एक समाधान DOMDocument का उपयोग करना है।

उदाहरण:

$str = " 
<html> 
<head> 
    <title>test</title> 
</head> 
<body> 
    </div>error. 
    <p>another error</i> 
</body> 
</html> 
"; 

$doc = new DOMDocument(); 
@$doc->loadHTML($str); 
echo $doc->saveHTML(); 

लाभ: मूल रूप से पीएचपी, पीएचपी साफ के विपरीत में शामिल थे।

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