Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/02/2007, 12h27   #1
Invité régulier
 
Inscription : février 2007
Messages : 17
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 17
Points : 5
Points : 5
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 :
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
mydev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2007, 12h42   #2
Membre éprouvé
 
Avatar de goodpz
 
Inscription : février 2007
Messages : 475
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 475
Points : 474
Points : 474
\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é)
goodpz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2007, 14h13   #3
Invité régulier
 
Inscription : février 2007
Messages : 17
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 17
Points : 5
Points : 5
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
mydev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2007, 14h19   #4
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
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"

Citation:
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...
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2007, 14h33   #5
Invité régulier
 
Inscription : février 2007
Messages : 17
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 17
Points : 5
Points : 5
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.
mydev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2007, 14h52   #6
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
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...
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h27.


 
 
 
 
Partenaires

Hébergement Web