在XML

2013-07-05 29 views
5

更換CDATA標籤我有內部可能出現的多個CDATA標籤的字符串:在XML

<![CDATA[A Survey of Applications of Identity-Based Cryptography in Mobile Ad-Hoc Networks]]> 

我使用javascript/jQuery和我需要刪除多個CDATA標記(用「」替換它們)。

我怎麼能寫這與正則表達式?

+1

試圖用正則表達式做到這一點將導致瘋狂。看到[這個答案](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags#1732454) –

+0

你想刪除只有'<! CDATA ['及其關閉]]>',或者包含標籤內文本的所有內容? –

+0

我只想刪除所有cdata標記的出現,使用這個:string.replace(「<![CDATA [」,「」).replace(「]]>」,「」);只會刪除一個。 – Toniq

回答

5

@Jim Garrison在上面的評論中是正確的:無法穩健地用正則表達式解析XML/HTML。該語言太複雜,無法用正則表達式表示。

但是,這並不意味着你不能寫一個正則表達式,它將覆蓋最合理的情況,這可能足以滿足你的需求。例如,下面的JavaScript正則表達式將主要做你想要什麼:

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

說明的兩件事情在這個正則表達式:在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標誌,以表明所有比賽應更換。否則只會替換第一場比賽。

閱讀評論,它看起來像你可能想簡單地去除CDATA標籤,同時保持其內容完好無損。正如@Jim Garrison指出的那樣,這是一個糟糕的主意,因爲你很容易留下無效的HTML;這就是CDATA的重點。但如果你確實想這樣做,這是如何:

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