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

Langage PHP Discussion :

Question débutant pour une regex


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1
    Par défaut Question débutant pour une regex
    Bonjour à tous,

    J'ai suivit des tutos et cours débutant pour les regex mais c'est vraiment pas évident au début ...

    Je veux utiliser preg_match pour extraire une information d'une page html.
    Voici le bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <span>
            <i class="flag-me"></i><br>
            4885<br>
            <p>Bonjour</p>
    </span>
    Je veux extraire le nombre 4885 de ce code.
    J'ai essayé avec ça mais ça ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '#<i class="flag-me"></i><br>(.+)<br>#iU'
    Merci 1000 fois d'avance pour votre aide.

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    essaie avec ce pattern :

  3. #3
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Pour le texte perçu comme complètement déterministique, voici le pattern en regex à lui (j'ai mis \r\n pour fixer l'idée, pour *nix c'est \n par exemple):

    Code texte : Sélectionner tout - Visualiser dans une fenêtre à part
    '#^<span>\r\n[ ]{8}<i class="flag-me"></i><br>\r\n[ ]{8}4885<br>\r\n[ ]{8}<p>Bonjour</p></span>$#';

    Maintenant, vous voulez matcher une partie particulière qui peut vous intéresser, donc ça devient comme ceci:

    Code texte : Sélectionner tout - Visualiser dans une fenêtre à part
    '#<i class="flag-me"></i><br>\r\n[ ]{8}4885<br>$#';

    Et puis, il semble une bonne chose de pourtant laisser une partie très indéterminée capturée comme sous-match et vous pensez un fanion PCRE_UNGREEDY est une bonne chose de faire et aussi PCRE_CASELESS, ça devient:

    Code texte : Sélectionner tout - Visualiser dans une fenêtre à part
    '#<i class="flag-me"></i><br>\r\n[ ]{8}(.+)<br>$#iU';    //PCRE_UNGREEDY on

    Et puis, vous pensez espace blanche devrait laisser indéterminée et qu'on a un fanion PCRE_UNGREEDY déjà, ça devient ceci:

    Code texte : Sélectionner tout - Visualiser dans une fenêtre à part
    '#<i class="flag-me"></i><br>\s*?(.+)<br>$#iU';    //PCRE_UNGREEDY on; ? pour le renverser

    Voilà, c'est fait.

    D'ailleurs, je ne pense pas le fanion U est très souhaîtable à mettre en général, comme c'est trop lié à regex de php.

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    Par défaut
    Tu as oublié de prendre en compte tous les caractères blancs (espaces, nouvelles lignes, éventuellement tabulations) dans ton expression. Ce qui fait que ta pattern échoue juste après le premier <br>.

    Pour les indiquer, tu peux utiliser la classe de caractères \s qui les contient tous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $subject = <<<'EOF'
     <span>
            <i class="flag-me"></i><br>
            4885<br>
            <p>Bonjour</p>
    </span>
    EOF;
    $pattern = '~<i class="flag-me"></i><br>\s+([^<]+)<br>\s+<p>Bonjour</p>~';
     
    if (preg_match($pattern, $subject, $match)) {
        echo $match[1];
    }
    Ensuite plutôt que d'utiliser le point et un quantificateur parresseux (.+? ou /°°°.+°°°/U), mieux vaut utiliser une classe de caractère négative (une classe excluant des caractères) et un quantificateur gourmand, pour 3 raisons:

    1) C'est bien plus explicite et contraignant (on voit tout de suite où ça s'arrête)
    2) C'est beaucoup plus rapide
    3) Tu évites le problème des nouvelles lignes que le . ne matche pas (ou alors il faut rajouter le modifier 's' à la fin de la pattern).

    Maintenant si tu veux être plus précis et indiquer les sauts de ligne et les espaces ou tabulations, tu peux remplacer les \s+ par \R\h+\R est un raccourci pour (?>\r\n|[\r\n]) (ce qui permet de matcher les sauts de ligne quelque soit le système) et où \h est une classe de caractères blancs et horizontaux (comme les espaces et les tabulations)

Discussions similaires

  1. aide pour une regex
    Par casp13 dans le forum Langage
    Réponses: 3
    Dernier message: 21/02/2008, 09h41
  2. [RegEx] Besoin d'aide pour une regex
    Par vallica dans le forum Langage
    Réponses: 3
    Dernier message: 20/09/2006, 08h50
  3. [RegEx] Aide pour une regex
    Par pj69100 dans le forum Langage
    Réponses: 6
    Dernier message: 29/08/2006, 19h19
  4. [RegEx] Aide pour une REGEX svp
    Par Invité dans le forum Langage
    Réponses: 2
    Dernier message: 12/07/2006, 17h41
  5. [RegEx] Aide pour une REGEX
    Par Death83 dans le forum Langage
    Réponses: 6
    Dernier message: 28/06/2006, 15h50

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