2013-07-05 21 views
5

Ho una stringa con possibili tag CDATA multipla all'interno:Sostituire i tag CDATA in XML

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

Sto usando JavaScript/jQuery e ho bisogno di rimuovere più tag CDATA (sostituirli con "").

Come potrei scrivere con regex?

+1

Provare a fare questo con regex porterà alla follia. Vedi [questa risposta] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags#1732454) –

+0

Vuoi rimuovere solo il ' ', o tutto compreso il testo all'interno del tag? –

+0

Voglio solo rimuovere tutte le occorrenze dei tag cdata, usando questo: string.replace ("", ""); ne rimuoverò solo uno. – Toniq

risposta

5

@Jim Garrison è corretto nel suo commento sopra: non c'è modo di robustamente analizzare XML/HTML con espressioni regolari. La lingua è troppo complessa per essere rappresentata da un'espressione regolare.

Tuttavia, ciò non significa che non è possibile scrivere una regex che coprirà casi più ragionevoli, che probabilmente sarà sufficiente per le vostre esigenze. Ad esempio, la seguente espressione regolare JavaScript saranno per lo più fare quello che vuoi:

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

Le due cose da notare in questa espressione regolare: il carattere jolly (.*?) all'interno del corpo CDATA è fatto pigro con il modificatore ?. Senza questo, la seguente cosa negativa sarebbe accaduto:

'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" 

L'altra cosa è che noi usiamo la bandiera g per indicare che tutte le partite devono essere sostituiti. Altrimenti verrà sostituita solo la prima partita.

Leggendo i commenti, sembra che si desideri semplicemente rimuovere i tag CDATA lasciando intatti i loro contenuti. Come sottolineato da @Jim Garrison sopra, questa è una cattiva idea perché potresti facilmente essere lasciato con HTML non valido; questo è il punto centrale di CDATA. Ma se vuoi farlo, ecco come:

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