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 06/11/2007, 21h59   #1
Membre régulier
 
Inscription : mai 2007
Messages : 180
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 180
Points : 82
Points : 82
Par défaut ordre dans les motifs

Haa vraiment les regex.. un truc d'informaticien pour les informaticiens

Ce n'est pas mon premier regex, mais la je comprend pas :

je veux trouver le motif d'un entier OU les 3 lettres "abx"

donc :
Code :
1
2
3
4
 
$pattern ='`(?i:[0-9]*)|(?i:abx)`'; 
$nb_found=preg_match($pattern, $subject, $matches,PREG_OFFSET_CAPTURE);
print_r($matches);
si $subject= "44"
Array ( [0] => Array ( [0] => 44 [1] => 0 ) )
c bon.

si $subject= "abx"
Array ( [0] => Array ( [0] => [1] => 0 ) )
c pas bon..

Me demandez pas pourquoi j'ai essayé ça (généralement on essaye beaucoup de chose avec les regex), mais dans l'expression j'interverti les 2 motifs (je place le motif abx en premier), mais je ne les modifient pas, ils sont identique aux précédents :
Code :
1
2
3
4
 
$pattern ='`(?i:abx)|(?i:[0-9]*)`'; 
$nb_found=preg_match($pattern, $subject, $matches,PREG_OFFSET_CAPTURE);
print_r($matches);
si $subject= "44"
Array ( [0] => Array ( [0] => 44 [1] => 0 ) )
c bon.

si $subject= "abx"
Array ( [0] => Array ( [0] => abx [1] => 0 ) )
c bon.

Vous allez me dire "Ben donc ça marche, c'est quoi ton probleme ?".

J'aime bien comprendre ce que je code.. et je comprend pas pourquoi ça marche dans un cas et pas dans l'autre, alors que les motifs exprimés dans les deux cas sont exactement les mêmes.
gomodo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2007, 22h13   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par gomodo
je veux trouver le motif d'un entier OU les 3 lettres "abx"
L'explication est simple : ce n'est pas ce que vous demandez
Le motif (?i:[0-9]*)|(?i:abx) dit qu'il y aura correspondance s'il trouve 0 ou plus chiffres donc forcément il y aura toujours une correspondance sur votre chaîne avec seulement cette partie du motif.

Quand vous avez inversé les deux parties de l'alternative, l'expression n'est plus évaluée de la même façon : il cherche d'abord "abx" avant 0 ou N chiffres ce qui résout (tout du moins en partie) votre problème.

Pour le tout premier motif et en accord avec votre description, il aurait fallu indiquer au moins un chiffre [0-9]+ ou abx : [0-9]+|(?i:abx) (qu'on peut éventuellement améliorer sur la reconnaissance d'un nombre entier).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2007, 22h38   #3
Membre régulier
 
Inscription : mai 2007
Messages : 180
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 180
Points : 82
Points : 82
Je ne savait pas qu'il y avait un ordre dans les OU.
En bon informaticien, j'ai une lecture très booléenne des regex :

x OU y est équivalent à y OU x.

Va donc falloir que je me flagelle pour oublier ça pour les regex.

Ca va pas me réconcilier avec les regex tout ça...


Bonne soirée et merci pour ta réponse rapide.
gomodo 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 10h24.


 
 
 
 
Partenaires

Hébergement Web