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

ASP.NET Discussion :

Regex de netoyage de copier/coller depuis Office


Sujet :

ASP.NET

  1. #1
    Invité
    Invité(e)
    Par défaut Regex de netoyage de copier/coller depuis Office
    Bonjour,

    Voila sur le cms que j'ai crée il y a un fckeditor (un wysiwyg), dans lequel on peut copier / coller ses documents word .

    Problème : le code html est dégueulasse , il y a des balise non html ("<o:p>" ou "<st1:state w:st="on">")...

    Je voudrais donc nettoyer tout ça avec des regexp, je pense pas avoir beaucoup de choix.

    Donc est ce que vous connaissez une manière d'effectuer ceci :

    texte de base
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <font size="3" face="Times New Roman">du texte blabla<font color="red"> encore du texte mais rouge </font> la fin du texte</font>
    et d'en tirer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    du texte blabla<font color="red"> encore du texte mais rouge </font> la fin du texte
    Je souhaite donc garder les balises <font> (et leur balise fermente correspondante) ou l'on spécifie la couleur du texte mais pas les autres.

    Merci

  2. #2
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Points : 443
    Points
    443
    Par défaut
    Bonjour,

    Vu que ta chaine est un fragment XML, tu peux utiliser un objet de type XmlDocument et ne récupérer que les éléments qui te plaisent, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string xml = "<font size=\"3\" face=\"Times New Roman\">du texte blabla<font color=\"red\"> encore du texte mais rouge </font> la fin du texte</font>";
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xml);
    string xml2 = doc.FirstChild.InnerXml;

  3. #3
    Invité
    Invité(e)
    Par défaut
    Le problème c'est que je veux juste supprimer les balises et pas leur contenu.

  4. #4
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Points : 443
    Points
    443
    Par défaut
    Le code que j'ai écris permet de faire ça.

    Regarde le contenu de xml2 et tu verra qu'il est égal à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    du texte blabla<font color="red"> encore du texte mais rouge </font> la fin du texte

  5. #5
    Invité
    Invité(e)
    Par défaut
    Cmment je pourrais faire alors dans ce genre de cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    yyyyy<font size="3" face="Times New Roman">du texte blabla<font color="red"> encore du texte mais rouge </font> la fin du texte</font>zzzz
    pour loader une chaine dans du xml il faut que ce soit du xml strict, or ce n'est pas el case du html que j'ai.

  6. #6
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Points : 443
    Points
    443
    Par défaut
    Tu veux dire que certaines balises ne sont pas forcément bien fermées ?

    Dans ton exemple si dessus, cela passe encore. Au pire, il suffit de rajouter un élément <doc></doc> ou autre sur ta chaine. C'est pas vraiment un problème.

    Après oui, c'est sûr, si tes chaines possèdent des éléments qui ne sont pas fermés, ma technique ne fonctionne pas. Mais est-ce vraiment le cas ?

  7. #7
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Citation Envoyé par Paul Musso Voir le message
    Tu veux dire que certaines balises ne sont pas forcément bien fermées ?
    Dans ton exemple si dessus, cela passe encore. Au pire, il suffit de rajouter un élément <doc></doc> ou autre sur ta chaine. C'est pas vraiment un problème.
    Après oui, c'est sûr, si tes chaines possèdent des éléments qui ne sont pas fermés, ma technique ne fonctionne pas. Mais est-ce vraiment le cas ?
    La chaine que donne Bourgi n'est qu'un exemple, et il ne dit pas qu'il manque des balises. Il me semble que son problème est un peu plus complexe qu'une simple balise à supprimer :
    Citation Envoyé par Bourgui Voir le message
    Problème : le code html est dégueulasse , il y a des balise non html ("<o:p>" ou "<st1:state w:st="on">")...
    Je voudrais donc nettoyer tout ça avec des regexp, je pense pas avoir beaucoup de choix.
    Je souhaite donc garder les balises <font> (et leur balise fermente correspondante) ou l'on spécifie la couleur du texte mais pas les autres.
    Pour pouvoir répondre à ton besoin, Bourgi, efforce-toi d'exposer ta problématique avec le minimum de règles et qu'elles restent simples.

    Tu me corrigeras si tu je me trompe, mais d'après ce que j'ai compris, ton besoin peut se résumer comme ça :
    - supprimer toutes les balises = tout texte compris entre < et >
    - sauf les balises font contenant le mot color (dans ce cas, ça va être compliqué de récupérer la balise fermante </font> grâce à une RegEx.

    Si j'ai correctement formulé ton besoin, je pense que le mieux serait une lecture séquentielle.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 262
    Points : 95
    Points
    95
    Par défaut
    J'ai déjà fait un truc comme cela.
    J'avais éffectué un split avec ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Regex regexBalise = new System.Text.RegularExpressions.Regex("([<].*?[>])", RegexOptions.Singleline);
    Créer une petite classe balise


    Pour chaque element du splitage
    Si balise
    Je cree un objet mabalise de type balise
    Je regarde si balise autorisé si non je la supprime du splitage
    Si mabalise.ouvrante, je netoie et je place dans une pile
    Si mabalise.fermante,
    si mabalise.fermante correspond au dernier élément de ma pile
    je desempile ma pile
    sinon
    à toi de voir
    Si texte
    Rien

    Apres je fais un join

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    désolé pour le temp de retour du mess, mais en ce moment c'est plutot la gueurre ^^

    L'algo de snopims a l'air pas mal, meme si le "a toi de voir" est bizarre ...
    ex :
    <a bon><a pasbon>XXX</a></a>

    Il faut créer un sorte d'index par type de balise et faire 2 pile , une des supprimé et une des acceptée, quand on arrive a une balise fermante :
    si il y a une et une seule balise ouvrante correspondante en haut des deux pile
    si dans pile des supprimé : supprime
    si dans la pile des acceptée : ajoute
    sinon
    si dans pile des supprimé a index plus important : supprime
    si dans la pile des acceptée a index plus important : ajoute
    fin



    Meme si il ne marche que quand le code html est plus ou moins bien fait, c'est à dire que on a pas des
    <a><b></a></b>

    dans ces cas la, je pense qu'on supprime tout.

Discussions similaires

  1. Copier/Coller depuis listview
    Par Drowan dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 31/07/2014, 11h05
  2. [PR-2010] VBA Copier / coller depuis Excel
    Par jouclar dans le forum VBA Project
    Réponses: 1
    Dernier message: 17/04/2013, 16h05
  3. Copier/coller depuis un StyledText vers Word
    Par p1xl_01 dans le forum SWT/JFace
    Réponses: 0
    Dernier message: 08/01/2013, 18h06
  4. [XL-2003] Copier/coller depuis le navigateur
    Par Benjycool dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 04/05/2010, 07h51
  5. Réponses: 1
    Dernier message: 15/06/2009, 18h46

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