2012-07-02 28 views
8

Tôi muốn xác thực thời gian bằng regex. Tôi tạo ra các biểu thức sau đây:regex để xác nhận thời gian

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

Đây là vấn đề:

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

Không ai biết những gì là sai?

+1

bạn có thể đưa ra ví dụ về những gì bạn mong đợi không? –

+1

Dưới đây là một số ví dụ: 14:25 OK, 25:30 KO, 14:65 KO, 14:59 OK, 14:34:43 OK – bgondy

+0

Không phải là câu trả lời cho câu hỏi của bạn, nhưng bạn nên biết rằng không có thời gian hợp lệ là 24: * nn * –

Trả lời

19

Time in 24-Hour dạng mẫu biểu thức chính quy:

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

Định dạng đồng hồ 24 giờ là bắt đầu 0-23 hoặc 00-23 sau đó một dấu hai chấm bán (:) và làm theo bởi 00-59 sau đó (tùy chọn một dấu chấm phẩy (:) và theo sau 00-59).

Mô tả: định dạng thời gian

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

Matching:

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 

Không phù hợp với các định dạng thời gian:

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] 

Ví dụ:

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

Dường như OP muốn kết hợp 14:25:55 là thời gian hợp lệ. –

+1

Bây giờ nó có tính đến phần thứ ba của định dạng tme;) – fsenart

+0

+1 cho giải pháp (được chấp nhận bởi OP) với các ví dụ làm việc. Điều đó nói rằng, vẫn còn ở một mất mát để giải thích * tại sao * nỗ lực của OP phù hợp với 14: 2555 khi mô hình bao gồm^và $ neo. –

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

Điều này sẽ nhận được từ 00:00 đến 23:59 và 00:00:00 đến 23:59:59.

2

luân phiên là một nhà điều hành-ưu tiên thấp, do đó bọc nó trong một tổ chức phi chụp:

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

Xem bản demo here.

Các vấn đề liên quan