IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Problème sur une expression régulière [Tutoriel]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 18
    Points : 10
    Points
    10
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre chevronné
    Avatar de Bidouille
    Inscrit en
    Mars 2003
    Messages
    1 275
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 1 275
    Points : 1 992
    Points
    1 992
    Par défaut
    Moi j'utiliserais plutôt substr pour extraire la date et faire sa vérification
    Rédacteur PHP / Delphi ADO / Novell / OpenOffice.org

    Inutile de m'envoyer vos questions par MP, je ne réponds que par le forum.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Merci, je ne souhaite cependant pas faire la vérif de la date mais juste vérifier que le fichier a cette forme la : 20041109_CAC 40.txt .
    en plus ca m exerce aux expressions regulieres pour le .txt j arrive a la faire mais pour ce qu'il y a devant je peine depuis plusieurs heures.

    edit : la forme est 20041109_CAC 40.txt avec un espace avant 40.

  4. #4
    Membre actif
    Avatar de doof
    Inscrit en
    Août 2003
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 160
    Points : 294
    Points
    294
    Par défaut
    Salut, ton probleme vient de la sequence [01] ... sinon il est inutile de verifier la validité des chiffres d'une date puisque quasi impossible avec des expressions regulieres. Contentes toi de reperer 6 chiffres a la suite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /^20\d{6}_CAC 40\.txt$/

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Je ne le trouvais pas si mal ce motif !

    Le [01] c'est pour le 0 ou le 1 des mois (06 ou 12).

    Si il t'arrive d'avoir des dates comme 200466 (2004/06/06) il faut retravailler un peu ton motif. Par exemple:

    (?:20)?[0-9][0-9] match 2004 ou 04 (jusqu'en 2099) le (?: et une parenthèse non capturante.

    Jusque là, ça va. Mais....

    [01]?[0-9] match 06 ou 6 pour juin. mais aussi 19
    [0-3]?[0-9] match 05 ou 5 mais aussi 38 et 39

    Là ça devient un peu plus complexe. (mais tu veux t'exercer aux regex non ? )

    Pour le groupe jour :
    Tu pourrais faire (dans le genre lourd) 01|02|03 ...etc...1|2|3|4 ...etc... |30|31 mais ça donnera des boutons à Jeffrey Friedl chez qui j'ai trouvé cette perle :
    (?:0[1-9]|[12][0-9]?|3[01]?|[4-9]) Tout y est ! Mais il m'a fallu quelques minutes pour en comprendre toute la subtilité

    Pour le groupe mois que penses-tu de (?:10|[01][12]|0[3-9]|[1-9])
    (celui-ci est de moi donc prudence ! Il est sans doute moins ... béton que celui de Friedl!)
    10 pour le 10 (ben tiens!)
    [01][12] pour 01 02 11 et 12
    0[3-9] pour les 03 à 09
    [1-9] pour les 1 à 9 (sans zéro)

    Bon, doof a raison, les regex ne pourront pas tenir compte des mois de février et autres années bissextiles. Il existe d'excellentes fonctions php pour ça (checkdate par exemple).
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut [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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $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 . 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.
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Merci à tous, je vois que les jours fériés sont productifs ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème sur une expression régulière
    Par GregLig dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 22/12/2007, 13h34
  2. Problème avec une expression régulière ?
    Par MaTHieU_ dans le forum Delphi
    Réponses: 1
    Dernier message: 28/04/2007, 18h50
  3. [RegEx] problème avec une expression régulière
    Par sissi25 dans le forum Langage
    Réponses: 2
    Dernier message: 19/04/2007, 09h12
  4. Problème avec une expression régulière
    Par Darkroro dans le forum Langage
    Réponses: 7
    Dernier message: 09/10/2006, 12h13
  5. [RegEx] Aide sur une expression régulière toute simple
    Par tchoumak dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2005, 15h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo