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

C# Discussion :

Expression régulière pour retrouver un caractère entre des balises


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 15
    Points : 19
    Points
    19
    Par défaut Expression régulière pour retrouver un caractère entre des balises
    Bonjour,

    Je suis à la recherche d'une expression régulière qui pourrait retrouver un caractère dans du texte contenu entre deux balises xml.

    Exemple: <titre>Ceci est un titre avec un < interdit</titre>, je voudrais pouvoir retrouver < pour le remplacer par &lt;

    J'en ai besoin pour parser une string qui contient du xml pour retrouver les caractères < et > (voir d'autres) afin de pouvoir utiliser cette string pour construire un XmlDocument sans problème. Je suis en C#/.NET 3.5 et j'utilise Regex.Replace() pour les remplacements.

    Pour l'instant j'arrive à faire ceci:
    - L'expression permet de récupérer les balises + le texte et capture le caractère (mais je ne sais pas comment utiliser Regex dans ce sens pour lui dire de remplacer le caractère capturé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <titre.*?>.*?(<).*?</titre>
    - L'expression fonctionne mais que si le xml contient un seul <titre></titre>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?<=<titre.*>.*)<(?=.*</titre>)
    Merci d'avance pour votre aide!

  2. #2
    Membre averti Avatar de roster
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 397
    Points : 426
    Points
    426
    Par défaut
    Bonjour,

    As-tu déjà lu cet article? Il explique les principes de base.

    http://tim.oreilly.com/pub/a/oreilly...harp_0101.html

    Penses à poster le code où tu bloques pour que l'on puisse t'aider plus facilement.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 15
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Merci pour l'article! J'ai vu des choses intéressantes mais rien me concernant.

    En fait je recherche juste une expression régulière mais voici le code dans lequel je veux l'utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    // Tableau contenant les caractères à trouver et à remplacer
    string[,] invalidStrings = new string[,] { { "<", "&lt;" }, { ">", "&gt;" } };
     // L'expression régulière
    string pattern = "(?<=<{0}.*>.*){1}(?=.*</{0}>)";
    // Tableau des balises concernées par la recherche
    string[] tags = new string[] { "lien", "titre", "texte" };
     
                // Pour chaque caractère invalide
                for (int i = 0; i < (invalidStrings.Length / 2); i++)
                {
                    // Pour chaque balise
                    foreach (string tag in tags)
                    {
                        // Formate le pattern
                        string formatedPattern = string.Format(pattern, tag, invalidStrings[i, 0]);
                        // Remplace les caractères trouvés
                        xml = Regex.Replace(xml, formatedPattern, invalidStrings[i, 1], RegexOptions.Singleline);
                    }
                }
    Avec l'expression "(?<=<titre.*>.*)<(?=.*</titre>)" si j'ai plusieurs balises <titre> dans mon xml, toutes les balises ouvrantes de toutes les balises se trouvant après le premier caractère trouvé seront remplacer par "&lt;" jusqu'à ce qu'il trouve la toute dernière balise </titre>. Donc la fin de mon expression régulière est surement fausse mais je ne vois pas où exactement...

  4. #4
    Membre averti Avatar de roster
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 397
    Points : 426
    Points
    426
    Par défaut
    Essais avec RegexOptions.IgnoreCase.

  5. #5
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Ce code donne le résultat attendu si j'ai bien compris le problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @"<titre>Ceci est un titre avec un < interdit</titre><lien>Ceci <est> un lien</titre>
    <titre>Ceci est encore > un titre avec un < interdit</titre>";
     
    xml = Regex.Replace(xml, "(?<=<(titre|lien)>).+?(?=</(titre|lien)>)",
        delegate(Match m)
        {
            // On renvoie le contenu entre les balises titre/lien 
            // traité afin de remplacer les caractères spéciaux
            return System.Web.HttpUtility.HtmlEncode(m.Value);
        });
    A adapter, j'utilise HttpUtility.HtmlEncode mais ça ne correspond pas forcément à ce que tu veux car il n'y aura pas que < et > qui seront transformés.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 15
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Désolé pour cette réponse tardive!

    C'est exactement ce que je voulais et notamment pour System.Web.HttpUtility.HtmlEncode() car le contenu est afficher en html. Par contre, certaine de mes balises ont des attributs et l'expression que tu m'as donné ne les prends pas en compte. Je me suis mis au expression régulière très récemment et je n'arrive pas à la modifier pour arriver à mes fins. J'ai toutefois réussi à faire ce que je voulais par une autre méthode avec une autre expression régulière (qui ne fonctionne pas dans ta méthode par contre).

    Je préfèrerais utiliser ta méthode, saurais-tu comment modifier l'expression régulière (?<=<(titre|lien)>).+?(?=</(titre|lien)>) pour qu'elle prenne en compte des attributs?

  7. #7
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Essaye avec quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    string xml =
    @"<titre id=""1"">Ceci est un titre avec un < interdit</titre><lien id=""1"">Ceci <est> un lien</lien>
    <titre>Ceci est encore > un titre avec un < interdit</titre>";
     
    xml = Regex.Replace(xml, @"(?<=<(titre|lien).*?>).+?(?=</\1>)",
        delegate(Match m)
        {
            // On renvoie le contenu entre les balises titre/lien 
            // traité afin de remplacer les caractères spéciaux
            return System.Web.HttpUtility.HtmlEncode(m.Value);
        });

Discussions similaires

  1. [RegEx] Expression régulière pour supprimer des doublons
    Par cbroissa dans le forum Langage
    Réponses: 5
    Dernier message: 20/05/2017, 01h59
  2. Réponses: 4
    Dernier message: 14/11/2008, 21h00
  3. Réponses: 6
    Dernier message: 20/06/2008, 13h02
  4. [RegEx] Expression régulière pour réduire des URL
    Par kivan666 dans le forum Langage
    Réponses: 6
    Dernier message: 11/06/2006, 21h39
  5. [RegEx] Expression régulière pour trouver des mots
    Par cbroissa dans le forum Langage
    Réponses: 7
    Dernier message: 26/05/2006, 23h39

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