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 :

pb compréhension expression régulière [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 17
    Points : 11
    Points
    11
    Par défaut pb compréhension expression régulière
    Bonjour,
    je suis actuellement en train d'essayer de comprendre comment fonctionne un moteur de templates et pour me faire la main j'ai pris le moteur de PHPLib (fichier template.inc) ; dans la fonction set_block() dont le rôle est de faire un travail de remplacement on trouve :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
       $str = $this->get_var($parent);
        $reg = "/[ \t]*<!--\s+BEGIN $varname\s+-->\s*?\n?(\s*.*?\n?)\s*<!--\s+END $varname\s+-->\s*?\n?/sm";
        preg_match_all($reg, $str, $m);
     
        if (!isset($m[1][0])) {
          $this->halt("set_block: unable to set block $varname.");
          return false;
        }
        $str = preg_replace($reg, "{" . $name . "}", $str);
        $this->set_var($varname, $m[1][0]);
        $this->set_var($parent, $str);
    $var_name est une variable passée en paramètre à set_block.

    Je n'arrive pas à comprendre entièrement le sens de 2 parties de l'expression régulière : \s*?\n?(\s*.*?\n?)\s* et \s*?\n?/sm .
    J'ai pourtant bien fouiné dans les docs php ...

    Quelqu'un pourrait-il m'expliquer ce qu'elles matchent ?
    Merci par avance

  2. #2
    Membre confirmé Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Points : 514
    Points
    514
    Par défaut
    \s*?\n?(\s*.*?\n?)\s*
    0 ou plusieurs espaces, 0 ou 1 nouvelle ligne, ensuite on capture: (0 ou plusieurs espaces, 0 ou plusieurs caractères quelconques, 0 ou 1 nouvelle ligne), 0 ou plusieurs espaces

    \s*?\n?
    0 ou plusieurs espaces, 0 ou 1 nouvelle ligne

    Le tout saupoudré d'un peu d'ungreedy (*?)

    /sm
    s: dot all. Le '.' matche tout y compris une nouvelle ligne (\n)
    m: multiline. ^ et $ fonctionnent pour des nouvelles lignes. (inutile dans le pattern tel que tu l'as copié/collé)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 17
    Points : 11
    Points
    11
    Par défaut encore une petite précision
    Merci goopz, je commence à mieux comprendre
    mais il y a tjrs qque chose que j'ai du mal à voir : le "?" doit toujours encadrer l'élément facultatif, c'est bien ça ?
    et c'est pour ça que l'on a : ?\n? (un vieux souvenir des expressions régulières posix m'aurait fait écrire simplement \n? pour exprimer "\n 0 ou 1 fois")

    Autre chose, toujours à propos du "?" :

    (?:[a-z]+['\s])? : j'ai trouvé dans le manuel d'initiation aux expr. reg de Developpez.com, que cela signifie : 1 ou plusieurs lettres suivie(s) soit d'1 espace soit d'une ' et ce bloc est facultatif. Ok je comprends, sauf pour la syntaxe :
    "(?:" et ")?" sont les marqueurs qu'il faut tjrs utiliser pour encadrer un bloc facultatif c'est ça ?

    Merci encore

  4. #4
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par mydev
    mais il y a tjrs qque chose que j'ai du mal à voir : le "?" doit toujours encadrer l'élément facultatif, c'est bien ça ?
    et c'est pour ça que l'on a : ?\n? (un vieux souvenir des expressions régulières posix m'aurait fait écrire simplement \n? pour exprimer "\n 0 ou 1 fois")
    Non, en fait ce ? va avec le * juste avant : \s*? qui veut dire "un ou plusieurs espaces, sans être trop gourmand"

    Autre chose, toujours à propos du "?" :

    (?:[a-z]+['\s])? : j'ai trouvé dans le manuel d'initiation aux expr. reg de Developpez.com, que cela signifie : 1 ou plusieurs lettres suivie(s) soit d'1 espace soit d'une ' et ce bloc est facultatif. Ok je comprends, sauf pour la syntaxe :
    "(?:" et ")?" sont les marqueurs qu'il faut tjrs utiliser pour encadrer un bloc facultatif c'est ça ?

    Merci encore
    signifie que c'est le début d'une parenthèse qui ne capture pas.

    Ainsi, tu ne la retrouvera pas dans le tableau des résultats.
    Cette option est smart, mais facultative : tu peux très bien capturer et ne pas prendre en compte cette capture. J'imagine que c'est aussi un peu moins performant, mais de pas grand chose...
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 17
    Points : 11
    Points
    11
    Par défaut pas simple
    ok, merci jml94 ;
    je vois qu'il me reste du boulot pour saisir toutes les subtilités des regex ...
    merci.

  6. #6
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par jml94
    Non, en fait ce ? va avec le * juste avant : \s*? qui veut dire "un ou plusieurs espaces, sans être trop gourmand"
    Je voulais bien sûr dire "0 ou plusieurs espaces".

    T'façons, goodpz l'avait très bien dit juste avant...
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

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

Discussions similaires

  1. Compréhension d'un script PYTHON et expressions régulières
    Par Jéjé34 dans le forum Général Python
    Réponses: 2
    Dernier message: 04/06/2013, 07h58
  2. Problème de compréhension expression régulière
    Par Globalement dans le forum Administration système
    Réponses: 1
    Dernier message: 26/11/2010, 20h52
  3. [expression régulière] mon cerveau fait des noeuds..
    Par nawac dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 27/05/2003, 10h06
  4. Expressions réguliéres
    Par Tooms dans le forum Langage
    Réponses: 4
    Dernier message: 06/12/2002, 18h42
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

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