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 21/07/2007, 20h32   #1
Invité de passage
 
Inscription : février 2007
Messages : 4
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 4
Points : 4
Points : 4
Par défaut Capture de sous masques répétés à l'infini

Bonsoir tout le monde

J'ai une petite colle pour vous, amis balaises en expressions régulières...

Nous avons un texte de cette forme :
"$var1.var2"
ou encore
"$var1.var2.var3.var4"
enfin le nombre de varN n'a pas de limite supérieure en théorie (mais au minimum il est de 1)

Je recherche donc le masque de regexp qui me retournera un tableau :
Code :
1
2
3
4
5
6
<?php
$matches[1] = "var1";
$matches[2] = "var2";
$matches[3] = "var3";
$matches[4] = "var4";
?>
Voici le test (parmi tant d'autres) déja testé par moi :

Code :
1
2
3
4
5
<?php
preg_match('#\$([a-zA-Z0-9_]+)(?:\.([a-zA-Z0-9_]+))*#', '$var1.var2.var3.var4', $matches);
 
print_r($matches);
?>
Le problème de ce masque (et des expressions régulières en générale) c'est que le sous-masque suivi de * ne capture que la dernière occurence et non pas toutes !
Je me retrouve donc avec un tableau :
Code :
1
2
3
4
<?php
$matches[1] = "var1";
$matches[2] = "var4";
?>
Alors je vois déja venir les réponses du genre : "tu récupères 'var1.var2.var3.var4' et tu fais un explode à tous les points.

Oui mais non ! Par souci purement scientifique je veux savoir comment on peut le faire en Regexp !

J'ai essayé de m'intéresser aux sous-masques récursifs mais j'avoue que la doc PHP est plutôt obscure sur ce point.

C'est pourquoi je fais appel à vos dons de programmeurs pour résoudre ce problème par défi.

Merci beaucoup d'avance
ametaireau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2007, 12h29   #2
Membre chevronné
 
Avatar de Korko Fain
 
Étudiant
Inscription : août 2005
Messages : 632
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2005
Messages : 632
Points : 632
Points : 632
Code :
#(?:\$|\.)([A-Za-z0-9]+)+#
?
Korko Fain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/07/2007, 17h42   #3
Membre chevronné
 
Inscription : juillet 2002
Messages : 842
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 842
Points : 647
Points : 647
En fait les masques récursifs ne permettent pas ça. Voilà un exemple de masque récursif :

Code :
preg_match('#[a-zA-Z0-9_]+(?>\.(?R)|)#', '$var1.var2.var3.var4', $matches);
Ca reconnait quasiment ton langage, il manque le $ au début qu'on peut, rajouter peut être d'une manière ou d'une autre. Là, dans cet exemple simple, on chope un identificateur, et ensuite on regarde si y'a un point. Si y'en a un, on refait le test d'expression régulière récursivement, sinon, ça s'arrête là.

Elles ne changent rien au problème parce que de toute façon, $matches n'aura toujours que la dernière valeur capturée par une parenthèse.

En principe, la solution, c'est d'utiliser preg_match_all avec l'expression régulière de Korko Fain.
Blustuff est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h59.


 
 
 
 
Partenaires

Hébergement Web