2012-07-02 19 views
8

Chcę sprawdzić poprawność czasu za pomocą wyrażenia regularnego. I stworzył następującą zależność:regex dla sprawdzania poprawności czasowej

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

Oto problem:

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

Czy ktoś wie co jest nie tak?

+1

czy możesz podać przykłady tego, czego oczekujesz? –

+1

Oto kilka przykładów: 14:25 Ok, 25:30 KO, 14:65 KO, 14:59 OK, 14:34:43 OK – bgondy

+0

Nie jest to odpowiedź na twoje pytanie, ale należy pamiętać, że nie ma ważnego czasu jako 24: * nn * –

Odpowiedz

19

czas w formacie 24-godzinnym wzorcu wyrażenia regularnego:

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

24-godzinny format zegara jest zacząć od 0-23 lub 00-23 następnie semi dwukropek (:), a następnie przez 00-59 następnie (opcjonalnie średnik (:), a następnie przez 00-59).

Opis: formaty czasu

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

Pasujące:

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 

nie pasujące formaty czasu:

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] 

Przykład:

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

Wygląda na to, że OP chce również dopasować 14:25:55 jako ważny czas. –

+1

Teraz bierze pod uwagę trzecią część formatu tme;) – fsenart

+0

+1 dla rozwiązania (które zostało zaakceptowane przez OP) z przykładami roboczymi. To powiedziawszy, nadal nie jestem w stanie wyjaśnić * dlaczego * próba OP pasuje do 14: 2555, gdy wzorzec zawiera^i kotwice. –

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

Otrzyma od 00:00 do 23:59 i 00:00:00 do 23:59:59.

2

Rotacja jest operatorem niskim priorytecie, tak owinąć w grupie bez przechwytywania:

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

zobaczyć demo here.

Powiązane problemy