2012-07-02 9 views
8

Quiero validar un tiempo con una expresión regular. He creado la siguiente expresión:regex para validación de tiempo

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

Aquí está el problema:

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

¿Alguien sabe lo que está mal?

+1

¿Puedes darnos ejemplos de lo que esperas? –

+1

Éstos son algunos ejemplos: 14:25 OK, 25:30 KO, KO 14:65, 14:59 OK, OK 14:34:43 – bgondy

+0

No es una respuesta a su pregunta, pero usted debe ser consciente que no hay un tiempo válido como 24: * nn * –

Respuesta

19

hora en formato de 24 horas patrón de expresión regular:

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

El formato de reloj de 24 horas se inicia desde 0-23 o 00-23 a continuación, un punto y coma (:) y siga por 00-59 luego (opcionalmente un punto y coma (:) y seguir por 00-59).

Descripción: formatos de hora

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

a juego:

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 

que no coincida con formatos temporales:

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] 

Ejemplo:

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

Parece que el OP desea coincidir con 14:25:55 como un tiempo válido también. –

+1

Ahora tiene en cuenta la tercera parte del formato tme;) – fsenart

+0

+1 para la solución (que ha sido aceptado por el OP) con ejemplos de trabajo. Dicho esto, todavía no puedo explicar * por qué * el intento del PO coincide con 14: 2555 cuando el patrón incluía^y $ anclajes. –

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

Esto pasará de 00:00 a 23:59 y de 00:00:00 a 23:59:59.

2

La alternancia es un operador de baja prioridad, por lo que se envuelve en un grupo sin fines de captura:

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

Ver demostración de here.