2010-07-02 9 views
5

मेरे पास एक HTML स्रोत के रूप में एक स्ट्रिंग है और मैं यह जांचना चाहता हूं कि स्ट्रिंग वाले HTML स्रोत में एक टैग है जो खोला नहीं गया है।अनपेक्षित टैग के लिए एक HTML स्ट्रिंग की जांच

उदाहरण के लिए नीचे दिए गए स्ट्रिंग में WAVEFORM के बाद </u> है जिसमें <u> नहीं है।

WAVEFORM</u> YES, <u>NEGATIVE AUSCULTATION OF EPIGASTRUM</u> YES, 

मैं सिर्फ बंद टैग के इन प्रकार के लिए जाँच करना चाहते हैं और फिर मैं स्ट्रिंग की शुरुआत के लिए खुला टैग संलग्न करने के लिए है?

उत्तर

6

इस विशिष्ट मामले के लिए आप HTML Agility Pack का उपयोग करके यह दावा करने के लिए कर सकते हैं कि HTML अच्छी तरह से बनाया गया है या यदि आपके पास टैग नहीं खोले गए हैं।

var htmlDoc = new HtmlDocument(); 

htmlDoc.LoadHtml(
    "WAVEFORM</u> YES, <u>NEGATIVE AUSCULTATION OF EPIGASTRUM</u> YES,"); 

foreach (var error in htmlDoc.ParseErrors) 
{ 
    // Prints: TagNotOpened 
    Console.WriteLine(error.Code); 
    // Prints: Start tag <u> was not found 
    Console.WriteLine(error.Reason); 
} 
0

इतना आसान नहीं है। आप सीधे एचटीएमएल पार्सर का उपयोग नहीं कर सकते क्योंकि यह वैध एचटीएमएल नहीं है, लेकिन आप पूरी चीज पर आसानी से रेगेक्स फेंक नहीं सकते क्योंकि रेगेक्स घोंसले या अन्य एचटीएमएल जटिलताओं से निपट नहीं सकते हैं।

शायद आप जो भी कर सकते हैं उसके बारे में प्रत्येक मार्कअप संरचना को खोजने के लिए रेगेक्स का उपयोग करना होगा, उदाहरण के लिए। कुछ ऐसा:

<(\w+)(?:\s+[-\w]+(?:\s*(?:=\s*(?:"[^"]*"|'[^']*'|[^'">\s][^>\s]*)))?)*\s*> 
|</(\w+)\s*> 
|<!--.*?--> 

खाली टैग-टू-ओपन सूची और एक खाली टैग-टू-क्लोज़ सूची के साथ प्रारंभ करें। स्ट्रिंग में प्रत्येक मैच के लिए, समूह 1 और 2 को देखने के लिए देखें कि क्या आपके पास प्रारंभ या समाप्ति टैग है या नहीं। (या एक टिप्पणी, जिसे आप अनदेखा कर सकते हैं।)

यदि आपके पास प्रारंभ टैग है, तो आपको यह जानना होगा कि इसे बंद करने की आवश्यकता है यानी। अगर यह EMPTY सामग्री-मॉडल टैगों में से एक है जैसे <img>। यदि कोई तत्व EMPTY है, तो इसे बंद करने की आवश्यकता नहीं है ताकि आप इसे अनदेखा कर सकें। (यदि आपके पास एक्सएचटीएमएल है, तो यह सब कुछ आसान है।)

यदि आपके पास स्टार्ट-टैग है, तो रीजिक्स समूह में टैग नाम को टैग-टू-क्लोज़ सूची में जोड़ें। यदि आपके पास अंत टैग है, तो टैग-टू-क्लोज़ सूची के अंत से एक टैग लें (यह वही टैग नाम होना चाहिए जैसा कि वहां था, अन्यथा आपको अमान्य मार्कअप मिला है। अगर कोई टैग नहीं है टैग-टू-क्लोज़ सूची, इसके बजाय टैग-टू-ओपन सूची में टैग नाम जोड़ें।

एक बार जब आप इनपुट स्ट्रिंग के अंत तक पहुंच जाते हैं, तो प्रत्येक टैग-टू-ओपन टैग को प्रीपेड करें रिवर्स ऑर्डर में स्ट्रिंग, और रिवर्स ऑर्डर में टैग के करीब-करीब के लिए करीबी टैग संलग्न करें।

(हाँ, मैं रेगेक्स के साथ HTML को पार्स कर रहा हूं। मुझे लगता है कि इस प्रदर्शन की नीचता आप क्यों नहीं चाहते हैं। अगर कुछ भी है जो आप टैग के बीच में अपना मार्कअप पहले से ही छीनने से बचने के लिए कर सकते हैं, तो ऐसा करें।)

+0

एचटीएमएल टैग और regexp वास्तव में एक अच्छा विचार नहीं है –

+2

गोश, वास्तव में, क्या आपको लगता है? – bobince

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