2013-07-05 7 views
5

में cdata टैग की जगह मैं अंदर संभव कई cdata टैग के साथ एक स्ट्रिंग है।एक्सएमएल

मैं इसे रेगेक्स के साथ कैसे लिख सकता हूं?

+1

रेगेक्स के साथ ऐसा करने की कोशिश करने से पागलपन हो जाएगा। [यह उत्तर] देखें (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags#1732454) –

+0

क्या आप केवल '', या टैग के अंदर पाठ सहित सब कुछ? –

+0

मैं बस इसका उपयोग कर सीडीएटा टैग के सभी अवसरों को हटाना चाहता हूं: string.replace ("", ""); केवल एक को हटा देगा। – Toniq

उत्तर

5

@ जिम गैरीसन ऊपर अपनी टिप्पणी में सही है: नियमित अभिव्यक्तियों के साथ मजबूत पार्स एक्सएमएल/एचटीएमएल का कोई तरीका नहीं है। एक नियमित अभिव्यक्ति द्वारा भाषा का प्रतिनिधित्व करने के लिए बहुत जटिल है।

हालांकि, इसका मतलब यह नहीं है कि आप एक रेगेक्स नहीं लिख सकते हैं जो सबसे उचित मामलों को कवर करेगा, जो शायद आपकी आवश्यकताओं के लिए पर्याप्त होगा। इस नियमित अभिव्यक्ति में नोट के

input.replace(/<!\[CDATA\[.*?\]\]>/g, ''); 

दो बातें: उदाहरण के लिए, निम्न JavaScript regex ज्यादातर तुम क्या चाहते हो जाएगा वाइल्डकार्ड (.*?) CDATA शरीर के अंदर ? संशोधक के साथ आलसी बना है। कि बिना, निम्नलिखित बुरी बात क्या होगा:

'before <![CDATA[blah]]> some stuff between <![CDATA[another cdata]]> after' 
    .replace(/<!\[CDATA\[.*\]\]>/g, ''); 
// returns "before after" when we probably 
// wanted "before some stuff between after" 

दूसरी बात यह है कि हम संकेत मिलता है कि सभी मैचों प्रतिस्थापित किया जाना चाहिए g ध्वज का उपयोग करें। अन्यथा केवल पहला मैच बदल दिया जाएगा।

टिप्पणियों पर पढ़ना, ऐसा लगता है कि आप अपनी सामग्री को बरकरार रखते हुए सीडीएटीए टैग को आसानी से बाहर करना चाहते हैं। जैसा कि @ जिम गैरीसन ऊपर बताता है, यह एक बुरा विचार है क्योंकि आप आसानी से अमान्य HTML के साथ छोड़े जा सकते हैं; यह सीडीएटीए का पूरा बिंदु है। लेकिन अगर आप ऐसा करना चाहते हैं, तो यहां बताया गया है:

'outside <![CDATA[(cdata1)]]> inside <![CDATA[(cdata2)]]> after' 
    .replace(/<!\[CDATA\[(.*?)\]\]>/g, '$1'); 
// yields "outside (cdata1) inside (cdata2) after"