2013-07-05 5 views
5

J'ai une chaîne avec plusieurs balises CDATA possibles à l'intérieur:Remplacer les balises XML CDATA

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

J'utilise javascript/jquery et je dois supprimer plusieurs balises CDATA (les remplacer par « »).

Comment écrire avec regex?

+1

Essayer ceci avec regex mènera à la folie. Voir [cette réponse] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags#1732454) –

+0

Voulez-vous supprimer uniquement le ', ou tout y compris le texte à l'intérieur de la balise? –

+0

Je veux juste supprimer toutes les occurrences de balises cdata, en utilisant ceci: string.replace ("", ""); n'en supprimera qu'un. – Toniq

Répondre

5

@Jim Garrison a raison dans son commentaire ci-dessus: il n'y a aucun moyen de robuste analyser XML/HTML avec des expressions régulières. Le langage est trop complexe pour être représenté par une expression régulière.

Cependant, cela ne signifie pas que vous ne pouvez pas écrire une regex qui couvrira cas les plus raisonnables, ce qui sera probablement suffisant pour vos besoins. Par exemple, l'expression régulière JavaScript suivant fera la plupart du temps ce que vous voulez:

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

Les deux choses de note dans cette expression régulière: le caractère générique (.*?) à l'intérieur du corps CDATA est fait paresseux avec le modificateur ?. Sans cela, la chose suivante se passerait-il mauvais:

'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'autre chose est que nous utilisons le drapeau g pour indiquer que tous les matches doivent être remplacés. Sinon, seul le premier match sera remplacé. En lisant les commentaires, il semble que vous souhaitiez simplement supprimer les étiquettes CDATA tout en laissant leur contenu intact. Comme le souligne @Jim Garrison ci-dessus, c'est une mauvaise idée car vous pourriez facilement vous retrouver avec un code HTML invalide; c'est tout le point de CDATA. Mais si vous voulez faire cela, voici comment:

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