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 :

[C#] Regular Expression


Sujet :

C#

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut [C#] Regular Expression
    Bonjour a tous et joyeux noël !

    J'ai un petit probleme avec des regexp en c# je recupere le code HTML d'une page et je soutairais recuperer ce qu'il y a entre les balise <h1></h1>.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            private void GetTitle()
            {
                Regex title = new Regex("<h1>(?<title>)</h1>");
                Match m = title.Match(this._contentInformations);
                if (m.Success)
                {
                    this._map["Title"] = m.Groups["title"].Value;
                }
            }
    Or m.success = false alors que la page contient bien la balise h1.

    Comment faire ?

    Merci !

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ben ton groupe de capture ne contient rien, donc ça ne marchera que pour une balise h1 vide... Avec ça, ça devrait marcher mieux :

    "<h1>(?<title>.+)</h1>"

    Note que les expressions régulières sont particulièrement inadaptées pour parser du HTML... utilise plutôt le DOM (HtmlDocument) si ton HTML est affiché dans un WebBrowser, ou alors un outil comme le HTML Agility Pack.
    On ne peut malheureusement pas utiliser un parser XML, car ceux-ci nécessitent un document XML valide (et c'est rarement le cas pour du HTML...)

  3. #3
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    tomlev:

    Je profite de la situation pour te demander un petit complément. Si on code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Regex title = new Regex("<h1>(?<title>.+)</h1>");
    Match m = title.Match(@"<h1>Bonjour</h1><h1>Adieu</h1>");
    if (m.Success)
        MessageBox.Show(m.Groups["title"].Value);
    ça affiche: "Bonjour</h1><h1>Adieu"

    Normal puisque le texte est compris entre les deux balises.

    Mais quelle serait la syntaxe pour obtenir les 2 résultats "Bonjour" et "Adieu" ?

    Papy

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Mais quelle serait la syntaxe pour obtenir les 2 résultats "Bonjour" et "Adieu" ?
    "<h1>(?<title>.+?)</h1>"

    Le modificateur "?" après le "+" signifie "le moins de caractères possible" (lazy). Le comportement par défaut est de prendre le plus de caractères possible (eager)

  5. #5
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Citation Envoyé par tomlev Voir le message
    "<h1>(?<title>.+?)</h1>"

    Le modificateur "?" après le "+" signifie "le moins de caractères possible" (lazy). Le comportement par défaut est de prendre le plus de caractères possible (eager)
    Ca fait des années que j'essaye de comprendre ce truc et je reste lamentable sur ce sujet

    J'ai rajouté le ? comme tu l'indiques mais du coup c'est le code qui doit plus coller. J'obtiens 2 affichages avec
    <h1>Bonjour</h1>
    suivi de
    Bonjour

    Je vais continuer à essayer de trouver enfin un tutoriel qui explique ça de façon claire ....

    Merci quand même pour cette indication sur le lazy et le eager.


    suite ...

    Pour l'instant, j'en suis là, et pas mécontent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                foreach (Match item in new Regex("<h1>(?<title>.+?)</h1>").Matches(@"<h1>Bonjour</h1><h1>Adieu</h1>"))
                    MessageBox.Show(item.Groups[1].Value);

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 177
    Par défaut
    Pour ça moi j'utiliserai une autre expression régulière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "<h1>([a-z-A-Z]*)</h1>"
    et là tu aura bien Bonjour et Adieu

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Arsenic68 Voir le message
    Pour ça moi j'utiliserai une autre expression régulière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "<h1>([a-z-A-Z]*)</h1>"
    et là tu aura bien Bonjour et Adieu
    Et s'il y a des espaces, des chiffres ou d'autres balises HTML entre <h1> et </h1>, tu n'auras rien du tout

  8. #8
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Par défaut
    Comme le disais Tomlev plus haut, pourquoi passer par une regex ?

    Utilise la classe HtmlGenericControl du Framework :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string maString;
    HtmlGenericControl h1 = new HtmlGenericControl("h1");
    //puis récupération du contenu du <H1> par 
    maString = h1.InnerHtml;

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par calagan99 Voir le message
    Comme le disais Tomlev plus haut, pourquoi passer par une regex ?

    Utilise la classe HtmlGenericControl du Framework :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string maString;
    HtmlGenericControl h1 = new HtmlGenericControl("h1");
    //puis récupération du contenu du <H1> par 
    maString = h1.InnerHtml;
    Euh... ça c'est bien si c'est toi qui définis le contenu de la balise h1, mais si tu dois parser du HTML existant ça n'aide pas beaucoup

  10. #10
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Par défaut
    Tomlev, je ne suis pas sûr de bien comprendre

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par calagan99 Voir le message
    Tomlev, je ne suis pas sûr de bien comprendre
    Ben ta proposition ne répond pas à la question, qui est comment extraire ce qui est entre <h1> et </h1> dans une chaine de caractères. Suppose que tu as ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string html = "<h1>Bonjour</h1>";
    Comment tu extrais "Bonjour" avec HtmlGenericControl ?

  12. #12
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string html = "<h1>Bonjour</h1>";
    Comment tu extrais "Bonjour" avec HtmlGenericControl ?
    Bah, avec la méthode proposée ci-dessus

    Mea Culpa, je suis à la rue aujourd'hui. Il s'agit d'un bloc de HTML récupéré dans une string, je n'avais pas fait attention.

    Désolé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Regular expression qui ne fonctionne pas
    Par Remedy dans le forum Langage
    Réponses: 2
    Dernier message: 11/05/2007, 16h52
  2. [Regular expression] Possessive quantifiers
    Par Pragmateek dans le forum Langage
    Réponses: 1
    Dernier message: 24/06/2006, 12h55
  3. [debutant] Regular Expression
    Par absolut75 dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 13/06/2006, 01h43
  4. [RegEx] Empty regular expression
    Par Khrysby dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2006, 22h25
  5. [Regular Expressions] Numérotation romaine
    Par ramalho dans le forum Valider
    Réponses: 3
    Dernier message: 24/02/2004, 17h43

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