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 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

  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 659
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 75
    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 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 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

  9. #9
    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
    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 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
    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 659
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 75
    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 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 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
    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