[PHP] Preg_Match() syntaxe regex pcre

Preg_Match() syntaxe regex pcre [PHP] - PHP - Programmation

Marsh Posté le 26-11-2004 à 12:53:25    

Salut à toutes et à tous,
 
J'essaye d'extraire deux informations d'une chaîne où se trouve une date et un lieu de naissance. La date est au format "républicain" (du calendrier révolutionnaire).
 
Voici les chaînes:

Texte 1 [1erCompl.An08 Moyenmoutier)] => date: 1-comp-08; Moyenmoutier)
Texte 2 [1er comp AN10 Mouterhausen 57)] => date: 1-comp-10; Mouterhausen 57)
Texte 3 [3 Compl.An02 Baccarat)] => date: 3-comp-02; Baccarat)
Texte 4 [5éme comp AN12 Baccarat)] => date: 5-comp-12; Baccarat)
Texte 5 [3 Compl.AN04 Hargnies 08)] => date: 3-comp-08; )


 
Or, avec le masque que j'applique, je récupère correctement les infos dans les 4 premières chaînes, mais pas dans la 5ème...
 
Le masque est le suivant:

/([1-6])(.*|)(comp)(.*|)(an|)(.*|)([01]\d)/i


 
Dans la 5ème chaîne, les trois derniers sous-masques

(an|)(.*|)([01]\d)

englobent

"AN04 Hargnies 08"

au lieu de seulement

"AN04"

???
 
Y a-t-il un moyen d'indiquer au masque de s'arrêter sur la première occurence du sous-masque

([01]\d)

?
 
Merci, tchô


---------------
Combien de programmeurs travaillant chez Microsoft est-ce que cela prend pour changer une ampoule électrique? Aucun: Si l'ampoule est grillée, Microsoft déclare l'obscurité comme nouveau standard.
Reply

Marsh Posté le 26-11-2004 à 12:53:25   

Reply

Marsh Posté le 27-11-2004 à 09:01:26    

Désolé de répondre en posant une question, mais ça fait un moment que j'ai pas utilisé de regexp... à quoi correspond le '|' à la fin des parenthèses ? (edit: il veut dire "ou rien", c'est ça ?)
 
Je viens de tester au pif en remplaçant les '.*|' par des '.*?' (car je connais) et ça a l'air de mieux marcher pour la 5ème chaîne. :D
 
Edit: sûrement parce qu'il faut rendre la recherche du '.' "feignante", ce qui avait l'air d'être ton soucis (même si j'ai testé ça sans regarder de près ce que faisait ta regexp).


Message édité par sielfried le 27-11-2004 à 09:21:18

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 27-11-2004 à 15:11:22    

Sielfried a écrit :

à quoi correspond le '|' à la fin des parenthèses ? Il veut dire "ou rien", c'est ça ?


Absolument!
 
Je n'ai pas pris la peine (pour ne pas faire un post de trois kilomètres de long!) de décrire tous les cas de figure que je peux rencontrer dans la lecture des chaînes. Mais il y a effectivement des cas où on peut avoir:
 
18 VENT An 03 Baccarat
9FRIM AN11 Vitry
13 NIVO 02 Noirmoutier
 
Il faut donc pouvoir avoir des sous-masques séparés par du vide.
 

Sielfried a écrit a écrit :

Je viens de tester au pif en remplaçant les '.*|' par des '.*?' (car je connais) et ça a l'air de mieux marcher pour la 5ème chaîne. Sûrement parce qu'il faut rendre la recherche du '.' "feignante"



 
Effectivement, ça fonctionne!!! Mais pourquoi?! Là c'est moi qui ne maîtrise pas suffisament le regex! Que décrit .*? et est-ce que "rendre la recherche feignante" signifie qu'il s'arrête dès qu'il a trouvé une occurrence au lieu de continuer? Si ce le cas, en lisant la doc sur php.net, je pensais que cette syntaxe s'écrivait ?>.* mais cela ne marchait pas...
 
Sinon, j'avais fini par trouver aussi la modification suivante pour le sous-masque du "an" (.*an|.*|) au lieu de (an|)(.*|) et cela fonctionne.
 
Merci, A+


Message édité par mikeleetoris le 27-11-2004 à 15:14:02
Reply

Marsh Posté le 27-11-2004 à 15:31:10    

MikeLeeToris a écrit :


Effectivement, ça fonctionne!!! Mais pourquoi?! Là c'est moi qui ne maîtrise pas suffisament le regex! Que décrit .*? et est-ce que "rendre la recherche feignante" signifie qu'il s'arrête dès qu'il a trouvé une occurrence au lieu de continuer?


 
Effectivement, cela signifie en gros ça.
 
Par exemple, la regexp /(.*)FIN/ (qui récupère ce qu'il y a avant "FIN" ), et la regexp /(.*?)FIN/ (qui fait la même chose en mode "feignant" ), le résultat sera différent sur une chaîne de type "abcdFINefghFIN". La première regexp va sortir "abcdFINefgh" (elle cherche le dernier "FIN" de la chaîne), alors que la deuxième, plus feignante, sortira "abcd" (elle s'arrête au premier "FIN" ).
 
J'espère que je suis clair. :D


Message édité par sielfried le 27-11-2004 à 15:32:27

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 30-11-2004 à 02:01:53    

Sielfried a écrit :

J'espère que je suis clair. :D


Ah mais claro qué si!!! Muy bien!!!
Et merci beaucoup, tant pour le tuyau que pour l'explicatif avec exemple et tout et tout!
A+

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed