2012-07-02 4 views
8

Je souhaite valider une heure avec une regex. J'ai créé l'expression suivante:regex pour la validation du temps

'#^([01][0-9])|(2[0-4])(:[0-5][0-9]){1,2}$#' 

Voici le problème:

<?php 
var_dump(preg_match('#^([01][0-9])|(2[0-4])(:[0-5][0-9]){1,2}$#', '14:25')); 
// Returns 1 (OK) 

var_dump(preg_match('#^([01][0-9])|(2[0-4])(:[0-5][0-9]){1,2}$#', '25:25')); 
// Returns 0 (OK) 

var_dump(preg_match('#^([01][0-9])|(2[0-4])(:[0-5][0-9]){1,2}$#', '14:2555')); 
// Returns 1 (instead of 0 as I would like to get) 
?> 

Quelqu'un sait-il ce qui est mal?

+1

pouvez-vous donner des exemples de ce que vous attendez? –

+1

Voici quelques exemples: 14:25 OK, 25:30 KO, KO 14:65, 14:59 OK, OK 14:34:43 – bgondy

+0

Pas une réponse à votre question, mais vous devez savoir Il n'y a pas d'heure valide en tant que 24: * nn * –

Répondre

19

Temps en format modèle d'expression régulière 24 heures:

([01]?[0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])? 

Le format d'horloge de 24 heures est de commencer à 0-23 ou 00-23 puis deux points demi (:) et suivre par 00-59 puis (en option un point-virgule (:) et suivi par 00-59).

Description: Les

(     # start of group #1 
    [01]?[0-9]  # start with 0-9,1-9,00-09,10-19 
    |    # or 
    2[0-3]   # start with 20-23 
)     # end of group #1 
:     # follow by a semi colon (:) 
[0-5][0-9]   # follow by 0..5 and 0..9, which means 00 to 59 
(     # start of group #2 
    :    # follow by a semi colon (:) 
    [0-5][0-9]  # follow by 0..5 and 0..9, which means 00 to 59 
)     # end of group #2 
?     # optional third part 

formats horaires assortis:

01:00, 02:00, 13:00, 
1:00, 2:00, 13:01, 
23:59, 15:00, 
00:00, 0:00, 
14:34:43, 01:00:00 

formats de temps correspondant Non:

24:00    # hour is out of range [0-23] 
12:60    # minute is out of range [00-59] 
    0:0    # invalid format for minute, at least 2 digits 
13:1    # invalid format for minute, at least 2 digits 
    0:00:0   # invalid format for seconds, at least 2 digits 
101:00    # hour is out of range [0-23] 

Exemple:

var_dump(preg_match('#^[01]?[0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?$#', '14:25')); // OK 
var_dump(preg_match('#^[01]?[0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?$#', '25:25')); // KO 
var_dump(preg_match('#^[01]?[0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?$#', '25:30')); // KO 
var_dump(preg_match('#^[01]?[0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?$#', '14:2555')); // KO 
var_dump(preg_match('#^[01]?[0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?$#', '14:65')); // KO 
var_dump(preg_match('#^[01]?[0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?$#', '14:59')); // OK 
var_dump(preg_match('#^[01]?[0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?$#', '14:34:43')); // OK 
+1

On dirait que l'OP souhaite également correspondre à 14:25:55 comme heure valide. –

+1

Il prend maintenant en compte la troisième partie du format tme;) – fsenart

+0

+1 pour la solution (qui a été acceptée par l'OP) avec des exemples de travail. Cela dit, je suis toujours incapable d'expliquer pourquoi la tentative de l'OP correspond à 14: 2555 quand le modèle inclut^et $ ancres. –

2
^(([0-1][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?)$ 

Ceci aura lieu de 00:00 à 23:59 et de 00:00:00 à 23:59:59.

2

est un opérateur Alternation faible priorité, donc l'envelopper dans un groupe non-capture:

#^(?:([01][0-9])|(2[0-3]))(:[0-5][0-9]){1,2}$# 
     +++     + 

Voir la démo here.