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

  1. #1
    Invité
    Invité(e)
    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

    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)
    Le problème c'est que je veux juste supprimer les balises et pas leur contenu.

  4. #4
    Rédacteur

    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)
    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

    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

    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
    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)
    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.