Preg_Match() syntaxe regex pcre [PHP] - PHP - Programmation
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.
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).
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+
Marsh Posté le 27-11-2004 à 15:31:10
MikeLeeToris a écrit : |
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.
Marsh Posté le 30-11-2004 à 02:01:53
Sielfried a écrit : J'espère que je suis clair. |
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+
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.