Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2758 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] Preg_Match() syntaxe regex pcre

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PHP] Preg_Match() syntaxe regex pcre

n°908386
mikeleetor​is
Posté le 26-11-2004 à 12:53:25  profilanswer
 

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.
mood
Publicité
Posté le 26-11-2004 à 12:53:25  profilanswer
 

n°909032
sielfried
Posté le 27-11-2004 à 09:01:26  profilanswer
 

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
n°909157
mikeleetor​is
Posté le 27-11-2004 à 15:11:22  profilanswer
 

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
n°909168
sielfried
Posté le 27-11-2004 à 15:31:10  profilanswer
 

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
n°910993
mikeleetor​is
Posté le 30-11-2004 à 02:01:53  profilanswer
 

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+


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] Preg_Match() syntaxe regex pcre

 

Sujets relatifs
condition non prise en compte HTML/PHP ???html/php/mysql
[PHP]Column count doesn't match value count at row 1envoi de mail php/mysql
Afficher l'uptime d'un serveur Windows avec phples espaces en php
Moteur de recherche GNU pour Linux/PHPajouter un module php (oubli à la compil !!)
[php/html] bouton submit avec image 
Plus de sujets relatifs à : [PHP] Preg_Match() syntaxe regex pcre


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR