begin process at 2012 05 17 09:45:20
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Date & Heure

 > TEST SI UNE DATE AU FORMAT FRANÇAIS EST VALIDE

TEST SI UNE DATE AU FORMAT FRANÇAIS EST VALIDE


 Information sur la source

 Description

Bon, c'est un cas extrême d'utilisation d'expression régulière. Plus un cas d'école, assez instructif, que quelque chose que j'utiliserai vraiment.
Je prêche plutôt de scinder une chaîne complexe en parties plus simples et d'utiliser du code pour vérifier les parties (avec ou sans expression régulière !).

Le but ici est de tester si une date du style jj/mm/aaaa est valide. Facile ? Pas si vous voulez rejeter les dates 29/02/2001 ou 31/11/2008... La validité se "limite" de 1600 à 2999.

Pour être honnête, la base a été écrite par un certain dany.lauener(at)b-i.com. Elle faisait 281 caractères de long. Je l'ai améliorée un peu : analysée en code étendu commenté ci-dessous, puis simplifié à 233 caractères, pour la même fonctionnalité.

J'espère qu'elle vous amusera, voire vous apprendra quelques astuces.

Source

  • L'expression brute :
  • ^((0[1-9]|1\d|2[0-8])/(0\d|1[012])/(1[6-9]|[2-9]\d)\d{2}|(29|30)/(0[13-9]|1[012])/(1[6-9]|[2-9]\d)\d{2}|31/(0[13578]|1[02])/(1[6-9]|[2-9]\d)\d{2}|29/02/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00))$
  • La même, décortiquée (option PCRE_EXTENDED par exemple : espaces non significatifs, le texte après # est du commentaire) :
  • ^(
  • # Jours 01 à 28, tous mois, toutes années : prend en compte rapidement les cas les plus courants
  • ( # Jours 01 à 28
  • 0[1-9]
  • |
  • 1\d
  • |
  • 2[0-8]
  • )
  • /
  • ( # Mois (quelconques)
  • 0\d
  • |
  • 1[012]
  • )
  • /
  • ( # Années (n'importe lesquelles)
  • 1[6-9] # 1600 à 1999
  • |
  • [2-9]\d # 2000 à 9999
  • )\d{2} # N'importe quelle paire de chiffres
  • |
  • # Cas des mois avec 30 jours (ou moins)
  • ( # 29 ou 30
  • 29
  • |
  • 30
  • )
  • /
  • ( # Mois avec 30 jours
  • 0[13-9]
  • |
  • 1[012]
  • )
  • /
  • (1[6-9]|[2-9]\d)\d{2} # Années comme ci-dessus
  • |
  • # Cas des mois avec 31 jours
  • 31
  • /
  • ( # Mois où le 31 est valide
  • 0[13578]
  • |
  • 1[02]
  • )
  • /
  • (1[6-9]|[2-9]\d)\d{2} # Années comme ci-dessus
  • |
  • # Cas du 29 février
  • 29/02/
  • ( # Années
  • (
  • 1[6-9] # 1600 à 1999
  • |
  • [2-9]\d # 2000 à 9999
  • )
  • ( # Les deux derniers chiffres sont divisibles par 4
  • 0[48]
  • |
  • [2468][048]
  • |
  • [13579][26]
  • )
  • |
  • ( # Années valides finissant par un double zéro
  • 16
  • |
  • [2468][048]
  • |
  • [3579][26]
  • )00
  • )
  • )$
L'expression brute :

^((0[1-9]|1\d|2[0-8])/(0\d|1[012])/(1[6-9]|[2-9]\d)\d{2}|(29|30)/(0[13-9]|1[012])/(1[6-9]|[2-9]\d)\d{2}|31/(0[13578]|1[02])/(1[6-9]|[2-9]\d)\d{2}|29/02/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00))$

La même, décortiquée (option PCRE_EXTENDED par exemple : espaces non significatifs, le texte après # est du commentaire) :

^(
   # Jours 01 à 28, tous mois, toutes années : prend en compte rapidement les cas les plus courants
   ( # Jours 01 à 28
      0[1-9]
      |
      1\d
      |
      2[0-8]
   )
   /
   ( # Mois (quelconques)
      0\d
      |
      1[012]
   )
   /
   ( # Années (n'importe lesquelles)
      1[6-9] # 1600 à 1999
      |
      [2-9]\d # 2000 à 9999
   )\d{2} # N'importe quelle paire de chiffres

   |

   # Cas des mois avec 30 jours (ou moins)
   ( # 29 ou 30
      29
      |
      30
   )
   /
   ( # Mois avec 30 jours
      0[13-9]
      |
      1[012]
   )
   /
   (1[6-9]|[2-9]\d)\d{2} # Années comme ci-dessus

   |

   # Cas des mois avec 31 jours
   31
   /
   ( # Mois où le 31 est valide
      0[13578]
      |
      1[02]
   )
   /
   (1[6-9]|[2-9]\d)\d{2} # Années comme ci-dessus

   |

   # Cas du 29 février
   29/02/
   ( # Années
      (
         1[6-9] # 1600 à 1999
         |
         [2-9]\d # 2000 à 9999
      )
      ( # Les deux derniers chiffres sont divisibles par 4
         0[48]
         |
         [2468][048]
         |
         [13579][26]
      )
      |
      ( # Années valides finissant par un double zéro
         16
         |
         [2468][048]
         |
         [3579][26]
      )00
   )
)$


 Conclusion

Ça montre bien ce qu'il ne faut pas faire avec les expressions régulières ! En l'occurrence, écrire des expressions illisibles, trop complexes et difficilement maintenables...
D'un autre côté, cela montre aussi qu'avec un peu d'analyse et de structuration, on peut quand même comprendre de telles expressions.


 Sources de la même categorie

DATE ANSI SQL par zen69
DÉTECTION DES HEURES / HORAIRES par f0xi

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture REGEXP TESTINATOR V1.0.0.0 par f0xi

Commentaires et avis

Commentaire de Delphiprog le 01/02/2009 10:02:16 administrateur CS 10/10

Très intéressant et fort bien "décortiqué". Je regrette seulement que seul le caractère "/" soit autorisé. Mais c'est un problème simple à résoudre à côté du reste :)
Félicitations : 10/10

Commentaire de Delphiprog le 01/02/2009 11:19:56 administrateur CS

Ah si, un autre regret : pourquoi obliger la saisie du caractère "0" pour le jour ou le mois ?
Pour rendre la saisie facultative, il suffit de mettre un point d'interrogation juste derrière les zéros concernés.
Ainsi, 1/1/2009 sera reconnu tout comme 01/1/2009, 1/01/2009 ou encore 01/01/2009.
Voici le début de la regex à modifier :
Avant :
^((0[1-9]|1\d|2[0-8])/(0\d|1[012])/
Suggestion :
^((0?[1-9]|1\d|2[0-8])/(0?\d|1[012])/

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Recherche doublons (PCRE) [ par orax ] Dans la chaine suivante : 12,55,4444,55,45,12,45,55,4444,12,55,44,4444,55,45,12,55,44,55,45,12,45,55,12,55,44,55,45 je veux qu'il trouve tous les doub


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,468 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales