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

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 32
    Points : 19
    Points
    19
    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 éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    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 à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 32
    Points : 19
    Points
    19
    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 éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    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 à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 32
    Points : 19
    Points
    19
    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 éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    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

  7. #7
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 659
    Points
    66 659
    Billets dans le blog
    1
    Par défaut
    +10^10 Auteur,
    les regExp c'est super puissant mais pas adapté pour vérifier une date, il faut utiliser comme le conseille Auteur le Date() du système ...

    Javatwister nous avait gratifié il y a un certain temps d'un code de verif de date dans les contributions si ma mémoire est bonne
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  8. #8
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Quelle mémoire Spacefrog (la contribution date de 2006)
    http://www.developpez.net/forums/sho...ate#post878767


    Sinon la FAQ :
    http://javascript.developpez.com/faq...Objs#VerifDate

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 32
    Points : 19
    Points
    19
    Par défaut
    Finalement l'expression régulière que j'ai conçue en ajoutant les parenthèses fonctionne parfaitement bien. Mais c'est vrai que j'aurais pu utiliser la fonction date(). Le problème ça aurait été la question du parsing. Si une personne tape par exemple 14/07/2008 au lieu de 2008-07-14, je vous laisse imaginer ce que ça donnerait quand je balancerai '8-' à la fonction date() pour le mois.

    Mais effectivement, j'aurais pu utiliser une regex simple comme [0-9]{4}-[0-9]{2}-[0-9]{2} puis ensuite, si ça passe, valider la date avec date().

    En tout cas, maintenant vous avez une regex efficace pour tester les dates en format ISO (YYYY-MM-DD).

    Merci beaucoup pour votre aide !

  10. #10
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    si tu utilises la fonction split, tu peux séparer les nombres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var laDate = "2008-07-14";
    alert(laDate.split("-"));  // retourne un tableau 2008,07,14

  11. #11
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 659
    Points
    66 659
    Billets dans le blog
    1
    Par défaut
    je doute que ton expression régulière soit capable de verifier si la date est vrai ...
    exemple mois à 30 ou 31 jours ou moins (années bissextiles ..)
    la vérification avec la Date() permet au moins cela
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 32
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    je doute que ton expression régulière soit capable de verifier si la date est vrai ...
    exemple mois à 30 ou 31 jours ou moins (années bissextiles ..)
    la vérification avec la Date() permet au moins cela
    Ben j'ai fait le test et ça marche parfaitement bien. La seule chose qui n'est pas vérifiable ce sont les années bissextiles. Ma Regex accepte 2007-02-29 même si l'année 2007 n'est pas bissextile. Mais bon, là il faut vraiment que l'utilisateur le fasse exprès. Mon but c'était d'éviter les erreurs provoquées par des gens qui ne respectent pas le format indiqué pour le format de la date.

+ 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