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

JavaScript Discussion :

RegEx.test()


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 32
    Par défaut RegEx.test()
    Bonjour,

    Je reviens vers vous pour régler mon petit problème de validation de date. La première étape c'est de valider le format à l'aide d'une expression régulière. Le format doit être : AAAA-MM-JJ. C'est le format ISO, quoi.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <html>
    <head>
      <script type="text/javascript">
        var dateRegExp = new RegExp("^[0-9]{4}-((01|03|05|07|08|10|12)-(0[1-9]|1[0-9]|2[0-9]|3[0-1]))|((04|06|09|11)-(0[1-9]|1[0-9]|2[0-9]|30))|(02-(0[1-9]|1[0-9]|2[0-9]))$", "g");
        var dt = "2008-05-05";
     
        if (dateRegEx.test(dt))
          alert("La date est OK.");
        else
          alert("La date ne respecte pas le format.");
      </script>
    </head>
    <body onLoad="dateTesting();">
      Hello World!
    </body>
    </html>
    Ça n'affiche rien, ça me surprend un peu.

  2. #2
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    bonjour,

    essaye ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var dateRegExp = /^([0-9]{4}-((0[0-9])|(1[0-2]))-(([0-2][1-9])|(3[0-1])))$/g;
    par contre je n'ai pas bien compris ceci dans ton expression régulière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (01|03|05|07|08|10|12)
    tu fais le ou entre le nombre qui est juste avant et juste après le symbole |... curieux

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 32
    Par défaut
    Bon, je viens de comprendre le problème ! Merci IE, qui prend la peine de m'afficher l'erreur. Comment fait-on sous Firefox pour faire afficher une erreur JavaScript ? (Sous IE, on voit le point d'exclamation sur fond jaune en bas, il suffit de double-cliquer dessus pour voir l'erreur.)

    Ma variable se nomme dateRegExp (avec le P au bout) alors que dans le code je faisais appel à dateRegEx.

    Pour la logique, c'est assez simple :

    4 chiffres puis un tiret
    01 ou 03 ou 05 ou 07 ou 08 ou 10 ou 12 puis un tiret puis un nombre allant de 01 à 31
    ou
    04 ou 06 ou 09 ou 11 puis un tiret puis nombre allant de 01 à 30
    ou
    02 puis un tiret puis un nombre allant de 01 à 29

    Ce n'est pas à ça que correspond mon expression régulière ?

  4. #4
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Citation Envoyé par Grizzzly Voir le message
    Comment fait-on sous Firefox pour faire afficher une erreur JavaScript ?
    Outils -> Console d'erreurs

    Citation Envoyé par Grizzzly Voir le message
    Pour la logique, c'est assez simple :
    4 chiffres puis un tiret
    01 ou 03 ou 05 ou 07 ou 08 ou 10 ou 12 puis un tiret puis un nombre allant de 01 à 31 puis un tiret
    ou
    04 ou 06 ou 09 ou 11 puis un tiret puis nombre allant de 01 à 30
    ou
    02 puis un tiret puis un nombre allant de 01 à 29

    Ce n'est pas à ça que correspond mon expression régulière ?
    ah d'accord tu fais la distinction entre les mois qui ont 30 et 31 jours... Bien justement ton expression régulière ne correspond pas à ça, c'est pour ça que je n'ai pas compris.

    par exemple :
    signifie que tu as 0 suivi de 1 ou 0 puis 3 donc ton expression régulière est vraie pour : 013 ou 003
    Donc je te laisse imaginer pour :


    Bon je regarde ton code et je te posterai une solution

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 32
    Par défaut
    Aaaaaaah, bon, je vois ! C'est bien la preuve que je débute avec les expressions régulières !

    Si je comprends bien, il suffirait d'ajouter plein de parenthèses pour régler le problème. Il faut simplement encadrer chaque mois et chaque jour d'une paire de parenthèses, c'est ça ? Le code va finir par ressembler à du LISP (pour ceux qui ont connu).

    EDIT:
    Je crois que j'ai trouvé la soluce :
    /^[0-9]{4}-(((01)|(03)|(05)|(07)|(08)|(10)|(12))-((0[1-9])|(1[0-9])|(2[0-9])|(3[0-1])))|(((04)|(06)|(09)|(11))-((0[1-9])|(1[0-9])|(2[0-9])|(30)))|(02-(0[1-9])|(1[0-9])|(2[0-9]))$/

    Ouf !
    Il n'y a pas moyen de simplifier ça ?

  6. #6
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    l'expression régulière est trop longue, ça va planter

    Je me demande si tu ne devrais pas créer un objet date avec les valeurs entrées puis comparer ces valeurs avec ce que retourne les méthodes de l'objet date :

    Syntaxe :
    new Date(AAAA,MM,JJ)
    Les mois commencent à 0 !
    janvier = 0
    février = 1
    mars = 2
    etc.
    décembre = 11

    Exemple 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var date = new Date(2053,01,32); //32 février 2053 
    date.getFullYear() // retourne 2053 (==2053)
    date.getMonth() // retourne 2 (!=1)
    date.getDate() // retourne 4 (!=32)
     
    // => soit le 4 mars 2053 
    // ====>  la date entrée n'est pas valide
    Exemple 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var date = new Date(2008,05,24); //24 juin 2008
    date.getFullYear() // retourne 2008 (==2008)
    date.getMonth() // retourne 5 (==5)
    date.getDate() // retourne 24 (==24)
     
    // => soit le 24 juin 2008
    // ====>  la date entrée est valide
    Exemple 3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var date = new Date(2008,32,52); // euh...
    date.getFullYear() // retourne 2010 (!=2008)
    date.getMonth() // retourne 9 (!=32)
    date.getDate() // retourne 22 (!=52)
     
    // ====>  la date entrée n'est pas valide

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 29/11/2009, 20h11
  2. [RegEx] test du nom sans chiffre avec regex
    Par mouss4rs dans le forum Langage
    Réponses: 2
    Dernier message: 29/01/2009, 16h19
  3. Regex perl (test \n)
    Par slockstone dans le forum Langage
    Réponses: 10
    Dernier message: 18/01/2009, 16h21
  4. class Regex (un test)
    Par Rukia dans le forum C#
    Réponses: 10
    Dernier message: 05/03/2008, 10h26
  5. résultat de test avec regex incompréhensible
    Par waldo2188 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 22/09/2007, 17h31

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