Problème sur une expression régulière
Bonjour,
débutant en php je dois me mettre aux expressions régulières afin de vérifier le nom d'un fichier uploadé
voila la ligne qui me pose problème :
Code:
if (preg_match("/20[0-9][0-9][01][0-9][0-3][0-9]_CAC 40\.txt$/",$file['userfile']['name']))
le nom du fichier est 20041109_CAC 40.txt . je l''utilise pour faire les testes mais il change selon la date. le _CAC 40.txt ne varie donc pas.
J'ai essayé sans le _CAC40 mais ca ne marche pas. j ai mis des \ devant le "_" mais toujours rien, il semble donc que ce soit la vérif de la date qui me pose un problème.
Merci
[regex]Validation de dates
Bonjour,
Heu, j'ai été un peu rapide hier (hum...). J'ai mélangé le motif (génial) de Friedl à ceux de mon cru. Le problème est qu'en acceptant des longueurs variables (1 ou 01) il y a un décalage dans le match. Dans 20052239 (non valide) il matchera 2005223. Chaque groupe pris séparément fonctionnera, mais pas s'ils sont mis bout à bout. Pas top donc, et retour case départ.
Si tes dates sont toujours à 8 positions voici ce que je te propose (avec l'option x pour pouvoir commenter le motif)
Code:
1 2 3 4 5 6 7 8 9 10 11
| $motif='/
^ # début de chaine
20[0-9][0-9] # groupe année de 2000 à 2099
(?:10|0[1-9]|1[12]) # groupe mois de 01 à 12
(?:[12][0-9]|0[1-9]|3[01]) # groupe jour de 01 à 31
_CAC\s40\.txt # ton nom de fichier \s pour espace \. pour le point
$ # fin de chaine
/x';
$date='20040631_CAC 40.txt';
echo preg_match($motif,$date); |
Si tu préfères le motif sur une seule ligne :
Code:
$motif='/^20[0-9][0-9](?:10|0[1-9]|1[12])(?:[12][0-9]|0[1-9]|3[01])_CAC\s40\.txt$/';
Mais une fois encore, une date comme 20040231 (31 février) sera validée! Utiliser les regex pour des dates ne représente donc qu'un exercice de style car non rigoureusement exact. Pour cela, utilise les fonctions PHP comme suggéré, à juste titre, par Bidouille et Doof.
Pour finir, ton motif de départ, même s'il est incomplet, fonctionne bien :wink: . Ton problème peut provenir du fait que tu utilises l'ancrage $ (fin de chaîne). Il ne faut donc pas de blanc à la fin de ta variable. Fais un trim() de cette variable avant de la passer à la fonction preg_match.