tfe Homepage

20/06/2008

Regex: verification de dates

Pour combler ce temps d'une façon ou d'une autre (et pour contredire une certaine personne sur IRC de la faisabilitée de la chose), je me suis amusé à  créer une regex vérifiant une date.

Certes, la regex est vraiment illisible, mais elle marche plutôt bien.

Un exemple d'utilisation:

$date="28/02/08 13:53";
if($date =~ /^
 (?:
     (?:
        (?:(?:[0-2][0-9]?)|(?:3[0-1]))
        /
        (?:(?:0?[13578])|(?:1[02]))
      )|
      (?:(?:(?:[0-2][0-9]?)|30)/(?:(?:0?[469])|11))
        |
      (?:
        (?:
          (?:[0-1][0-9]?)|2[0-8])/(?:0?2)
      )
  )/d{2}(?:d{2})?s+(?:[0-1]?[0-9]|2[0-4]):(?:[0-5]?[0-9])$/x)
{
    print "Date oK
";
}

ou sa version 1 ligne:

/^(?:(?:(?:(?:[0-2][0-9]?)|(?:3[0-1]))/(?:(?:0?[13578])|(?:1[02])))|
(?:(?:(?:[0-2][0-9]?)|30)/(?:(?:0?[469])|11))|(?:(?:(?:[0-1][0-9]?)|
2[0-8])/(?:0?2)))/d{2}(?:d{2})?s+(?:[0-1]?[0-9]|2[0-4]):(?:[0-5]?[0-9])$/x

Note: les années bissextiles ne sont pas prises en compte malheureusement...

Pour ceux désirant une version simple, ne vérfiant que les formats numériques
/^(dd?)/(dd?)/((?:dd){1,2})/


Exemple d'utilisation PHP:

if( preg_match("/^(dd?)/(dd?)/((?:dd){1,2})/",$mdate))
{
      echo "la date est correcte"; 
}

Exemple d'utilisation Perl:

if($mdate=~ /^(dd?)/(dd?)/((?:dd){1,2})/)
{
      print "la date est correcte";
}