इतना आसान नहीं है। आप सीधे एचटीएमएल पार्सर का उपयोग नहीं कर सकते क्योंकि यह वैध एचटीएमएल नहीं है, लेकिन आप पूरी चीज पर आसानी से रेगेक्स फेंक नहीं सकते क्योंकि रेगेक्स घोंसले या अन्य एचटीएमएल जटिलताओं से निपट नहीं सकते हैं।
शायद आप जो भी कर सकते हैं उसके बारे में प्रत्येक मार्कअप संरचना को खोजने के लिए रेगेक्स का उपयोग करना होगा, उदाहरण के लिए। कुछ ऐसा:
<(\w+)(?:\s+[-\w]+(?:\s*(?:=\s*(?:"[^"]*"|'[^']*'|[^'">\s][^>\s]*)))?)*\s*>
|</(\w+)\s*>
|<!--.*?-->
खाली टैग-टू-ओपन सूची और एक खाली टैग-टू-क्लोज़ सूची के साथ प्रारंभ करें। स्ट्रिंग में प्रत्येक मैच के लिए, समूह 1 और 2 को देखने के लिए देखें कि क्या आपके पास प्रारंभ या समाप्ति टैग है या नहीं। (या एक टिप्पणी, जिसे आप अनदेखा कर सकते हैं।)
यदि आपके पास प्रारंभ टैग है, तो आपको यह जानना होगा कि इसे बंद करने की आवश्यकता है यानी। अगर यह EMPTY
सामग्री-मॉडल टैगों में से एक है जैसे <img>
। यदि कोई तत्व EMPTY
है, तो इसे बंद करने की आवश्यकता नहीं है ताकि आप इसे अनदेखा कर सकें। (यदि आपके पास एक्सएचटीएमएल है, तो यह सब कुछ आसान है।)
यदि आपके पास स्टार्ट-टैग है, तो रीजिक्स समूह में टैग नाम को टैग-टू-क्लोज़ सूची में जोड़ें। यदि आपके पास अंत टैग है, तो टैग-टू-क्लोज़ सूची के अंत से एक टैग लें (यह वही टैग नाम होना चाहिए जैसा कि वहां था, अन्यथा आपको अमान्य मार्कअप मिला है। अगर कोई टैग नहीं है टैग-टू-क्लोज़ सूची, इसके बजाय टैग-टू-ओपन सूची में टैग नाम जोड़ें।
एक बार जब आप इनपुट स्ट्रिंग के अंत तक पहुंच जाते हैं, तो प्रत्येक टैग-टू-ओपन टैग को प्रीपेड करें रिवर्स ऑर्डर में स्ट्रिंग, और रिवर्स ऑर्डर में टैग के करीब-करीब के लिए करीबी टैग संलग्न करें।
(हाँ, मैं रेगेक्स के साथ HTML को पार्स कर रहा हूं। मुझे लगता है कि इस प्रदर्शन की नीचता आप क्यों नहीं चाहते हैं। अगर कुछ भी है जो आप टैग के बीच में अपना मार्कअप पहले से ही छीनने से बचने के लिए कर सकते हैं, तो ऐसा करें।)
एचटीएमएल टैग और regexp वास्तव में एक अच्छा विचार नहीं है –
गोश, वास्तव में, क्या आपको लगता है? – bobince