tfe - tfeserver homepage

Pour combler ce temps d'une façon ou d'une autre (et pour contredire une certaine personne sur IRC de la faisabilité 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\n";
}

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
/^(\d\d?)\/(\d\d?)\/((?:\d\d){1,2})/


Exemple d'utilisation PHP:
if( preg_match("/^(\d\d?)\/(\d\d?)\/((?:\d\d){1,2})/",$mdate))
{
      echo "la date est correcte"; 
}
Exemple d'utilisation Perl:
if($mdate=~ /^(\d\d?)\/(\d\d?)\/((?:\d\d){1,2})/)
{
      print "la date est correcte";
}

perl irc regex verification date

arnaud

le 28/06/08 23:38:12

A quoi servent tous ces (?:MOTIF) ?

tfe

le 01/07/08 10:33:55

à grouper sans capturer, mais je pense que tu le sais déjà. Je ne voulais pas utilise de parenthèses "capturantes" pour, au besoin, ne capturer vraiment que ce dont j'ai besoin.

arnaud

le 01/07/08 19:59:15

En fait, ma question était surtout: pourquoi as-tu besoin de regrouper autant ?

tfe

le 02/07/08 17:34:40

pour les "ou". Je ne sais pas si cela marcherait "aussi bien" sans. une idée de comment s'en passer?