IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Enlever les CDATA deja dans un CDATA


Sujet :

JavaScript

  1. #1
    Membre averti Avatar de mapmip
    Profil pro
    ulla
    Inscrit en
    juillet 2006
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ulla

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 291
    Points : 345
    Points
    345
    Par défaut Enlever les CDATA deja dans un CDATA
    Salut,
    je voudrais j'ai une chaîne de string et je veux supprimer par le biais de regex supprimer tous les <![CDATA[ ]]> qui
    sont déjà dans un autre <![CDATA[ ]]>

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let test ="  blabla   <![CDATA[  retetette     rpoep <![CDATA[   contenue à conserver  ]]>   roeporp eopo  ]]>   blabla          ";
    je veux que la chaine finale soit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "  blabla   <![CDATA[  retetette     rpoep    contenue à conserver     roeporp eopo  ]]>   blabla          ";

    Merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    mars 2002
    Messages
    39 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2002
    Messages : 39 574
    Points : 66 537
    Points
    66 537
    Billets dans le blog
    1
    Par défaut
    Perso je passerais plutot par le parsage DOM xml pour supprimer les noeuds enfants ...
    et encore c'est pas gagné car il te retournera le nested CDATA dans un comment en texte
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    mars 2009
    Messages
    2 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : mars 2009
    Messages : 2 773
    Points : 6 298
    Points
    6 298
    Par défaut
    On ne peut malheureusement pas faire appel au DOM dans ce cas précis car pour lui, dans la chaîne test, le CDATA c'est:
    Code * : Sélectionner tout - Visualiser dans une fenêtre à part
    <![CDATA[  retetette     rpoep <![CDATA[   contenue à conserver  ]]>
    (La première balise ouvrante et la première fermante).

    En partant du principe qu'il n'y a qu'un niveau d'imbrication, tu peux faire ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    let test ="blabla   <![CDATA[  retetette     rpoep <![CDATA[   contenue à conserver  ]]>   roeporp eopo  ]]>   blabla";
    //let test ="blabla   <![CDATA[  retetette     rpoep <![CDATA[   contenue à conserver  ]]>   roep <![CDATA[   contenue à conserver  ]]>   roeporp eopo  ]]>   blabla";
     
    let previousLength;
    let newLength;
     
    do {
        previousLength = test.length;
        test = test.replace(/(<!\[CDATA\[[^\]<]*(?:<(?!!\[CDATA\[)[^\]<]*|](?!]>)[^\]<]*)*)<!\[CDATA\[([\s\S]*?)]]>/g, '$1$2');
        newLength = test.length;
    } while(newLength < previousLength);
     
    console.log(test); // blabla   <![CDATA[  retetette     rpoep    contenue à conserver     roeporp eopo  ]]>   blabla
    La boucle do ... while permet de traiter les cas où un CDATA en contient plusieurs autres. (car le remplacement les enlève un par un).

    Détail de la pattern:
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    ( # groupe de capture 1
        <!\[CDATA\[
    
        [^\]<]* # tout ce qui n'est pas un ] ou <
        (?:
            < (?! !\[CDATA\[ ) # un < qui n'est pas le début d'une balise ouvrante
            [^\]<]*
          |
            ] (?!]>) # un ] qui n'est pas le début d'une balise fermante
            [^\]<]*
        )*
    )
    <!\[CDATA\[ 
    ( [\s\S]*? ) # groupe de capture 2
    ]]>

    S'il y a plus d'un niveau d'imbrication, alors il faut changer la pattern en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /(<!\[CDATA\[[^\]<]*(?:<(?!!\[CDATA\[)[^\]<]*|](?!]>)[^\]<]*)*)<!\[CDATA\[([^\]<]*(?:<(?!!\[CDATA\[)[^\]<]*|](?!]>)[^\]<]*)*)]]>/g
    Bien entendu tout ceci ne sera fonctionnel qu'à la condition qu'il n'y ait aucune balise CDATA ouvrante ou fermante qui soit orpheline.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/07/2013, 13h14
  2. treplace regex pour enlever les balises html
    Par briceg dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 23/10/2009, 10h47
  3. Regex pour enlever les chemin dans un binaire
    Par rgesnot dans le forum Langage
    Réponses: 1
    Dernier message: 19/09/2007, 16h03
  4. Regex pour enlever les comments HTML
    Par pongping dans le forum Langage
    Réponses: 2
    Dernier message: 02/09/2007, 20h00
  5. [FoxPro]Instruction pour enlever les accents ?
    Par Fab-FoxPro dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 19/08/2003, 15h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo