HTML / XML को मार्कअप और सामग्री में विभाजित किया गया है। रेगेक्स केवल एक शाब्दिक टैग पार्स करने के लिए उपयोगी है। मुझे लगता है कि आप सामग्री घटा सकते हैं। यह SAX पार्सर के लिए एक अच्छा विकल्प होगा। टैग और सामग्री को एक उपयोगकर्ता परिभाषित फ़ंक्शन तक पहुंचाया जा सकता है, जहां तत्वों के घोंसले बनाने / बंद करने पर नज़र रखी जा सकती है।
जहाँ तक सिर्फ टैग्स को पार्स करने का है, इसे रेगेक्स के साथ किया जा सकता है और इसका इस्तेमाल डॉक्यूमेंट्स से टैग्स को हटाने के लिए किया जाता है।
परीक्षण के वर्षों में, मैंने उस तरह से ब्राउज़रों को गुप्त पाया है जो टैग को अच्छी तरह से और बीमार दोनों तरह से बनाते हैं।
सामान्य तत्व इस फॉर्म के साथ पार्स किए जाते हैं:
इन टैग्स के मूल में इस regex का उपयोग किया गया है
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
आप इसे [^>]?
एक विकल्प के रूप में देखेंगे । यह बीमार-निर्मित टैग से असंतुलित उद्धरणों से मेल खाएगा।
यह भी है, नियमित अभिव्यक्ति के लिए सभी बुराई का सबसे मूल जड़ है । जिस तरह से इसका उपयोग किया जाता है वह एक लालसा को ट्रिगर करेगा, यह संतुष्ट करने के लिए लालची होगा, कि मात्रा निर्धारित कंटेनर से मेल खाना चाहिए।
यदि निष्क्रिय रूप से उपयोग किया जाता है, तो कभी कोई समस्या नहीं होती है लेकिन, यदि आप किसी चीज़ को एक वांछित विशेषता / मूल्य जोड़ी के साथ जोड़कर मिलान करने के लिए मजबूर करते हैं, और बैकट्रैकिंग से पर्याप्त सुरक्षा प्रदान नहीं करते हैं, तो यह नियंत्रण से बाहर है।
यह केवल सादे पुराने टैग के लिए सामान्य रूप है। [\w:]
टैग नाम का प्रतिनिधित्व करते हुए नोटिस करें? वास्तव में, टैग नाम का प्रतिनिधित्व करने वाले कानूनी चरित्र यूनिकोड वर्णों की एक अविश्वसनीय सूची है।
<
(?:
[\w:]+
\s+
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
\s* /?
)
>
आगे बढ़ते हुए, हम यह भी देखते हैं कि आप सभी टैग्स को पार्स किए बिना किसी विशिष्ट टैग की खोज नहीं कर सकते । मेरा मतलब है कि आप कर सकते हैं, लेकिन इसमें क्रियाओं के संयोजन का उपयोग करना होगा जैसे (* SKIP) (* FAIL) लेकिन फिर भी सभी टैग को पार्स करना होगा।
कारण यह है कि टैग सिंटैक्स को अन्य टैग्स आदि के अंदर छिपाया जा सकता है।
इसलिए, सभी टैग्स को निष्क्रिय करने के लिए, नीचे दिए गए एक regex की आवश्यकता होती है। यह विशेष रूप से अदृश्य सामग्री से भी मेल खाता है ।
नए HTML या xml या किसी अन्य नए निर्माण को विकसित करने के लिए, बस इसे एक विकल्प के रूप में जोड़ें।
वेब पेज नोट - मैंने कभी ऐसा वेब पेज (या एक्सएचटीएमएल / एक्सएमएल) नहीं देखा है
जिसके साथ यह परेशानी थी। अगर आपको एक मिल जाए, तो मुझे बताएं।
प्रदर्शन नोट - यह त्वरित है। यह सबसे तेज टैग पार्सर है जिसे मैंने देखा है
(तेजी से हो सकता है, कौन जानता है)।
मेरे कई विशिष्ट संस्करण हैं। यह स्क्रैपर के रूप में भी उत्कृष्ट है
(यदि आप हाथों पर टाइप कर रहे हैं)।
कच्चे रेगेक्स को पूरा करें
<(?:(?:(?:(script|style|object|embed|applet|noframes|noscript|noembed)(?:\s+(?>"[\S\s]*?"|'[\S\s]*?'|(?:(?!/>)[^>])?)+)?\s*>)[\S\s]*?</\1\s*(?=>))|(?:/?[\w:]+\s*/?)|(?:[\w:]+\s+(?:"[\S\s]*?"|'[\S\s]*?'|[^>]?)+\s*/?)|\?[\S\s]*?\?|(?:!(?:(?:DOCTYPE[\S\s]*?)|(?:\[CDATA\[[\S\s]*?\]\])|(?:--[\S\s]*?--)|(?:ATTLIST[\S\s]*?)|(?:ENTITY[\S\s]*?)|(?:ELEMENT[\S\s]*?))))>
स्वरूपित रूप
<
(?:
(?:
(?:
# Invisible content; end tag req'd
( # (1 start)
script
| style
| object
| embed
| applet
| noframes
| noscript
| noembed
) # (1 end)
(?:
\s+
(?>
" [\S\s]*? "
| ' [\S\s]*? '
| (?:
(?! /> )
[^>]
)?
)+
)?
\s* >
)
[\S\s]*? </ \1 \s*
(?= > )
)
| (?: /? [\w:]+ \s* /? )
| (?:
[\w:]+
\s+
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
\s* /?
)
| \? [\S\s]*? \?
| (?:
!
(?:
(?: DOCTYPE [\S\s]*? )
| (?: \[CDATA\[ [\S\s]*? \]\] )
| (?: -- [\S\s]*? -- )
| (?: ATTLIST [\S\s]*? )
| (?: ENTITY [\S\s]*? )
| (?: ELEMENT [\S\s]*? )
)
)
)
>