2008-09-01 20 views
34

Mẫu RegEx cho DateTime (2008-09-01 12:35:45) là gì?Mẫu regex cho datetime (2008-09-01 12:35:45) là gì?

tôi nhận được lỗi này:

No ending delimiter '^' found

Sử dụng:

preg_match('(?n:^(?=\d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(?(.0?2)(?=.{3,4}(1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00))|0?[1-9]|1\d|2[0-8])(?<sep>[/.-])(?<month>0?[1-9]|1[012])\2(?<year>(1[6-9]|[2-9]\d)\d{2})(?:(?=\x20\d)\x20|$))?(?<time>((0?[1-9]|1[012])(:[0-5]\d){0,2}(?i:\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$)', '2008-09-01 12:35:45'); 

Cung cấp cho lỗi này:

Warning: preg_match() [function.preg-match]: Compilation failed: nothing to repeat at offset 0 in E:\www\index.php on line 19

Trả lời

42

@Espo: Tôi chỉ có thể nói regex đó là đáng kinh ngạc. Tôi ghét phải viết mã mà đã làm một cái gì đó hữu ích với các trận đấu, chẳng hạn như nếu bạn muốn thực sự tìm ra những gì ngày và thời gian người dùng gõ.

Nó có vẻ như giải pháp của Tom sẽ đứng vững được nữa, vì nó là đơn giản về một lần zillion và với việc bổ sung một số dấu ngoặc đơn, bạn có thể dễ dàng nhận được tại các giá trị người dùng gõ:

(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}) 

Nếu bạn' sử dụng lại perl, sau đó bạn có thể nhận được các giá trị như sau:

$year = $1; 
$month = $2; 
$day = $3; 
$hour = $4; 
$minute = $5; 
$second = $6; 

Các ngôn ngữ khác sẽ có khả năng tương tự. Lưu ý rằng bạn sẽ cần phải thực hiện một số sửa đổi nhỏ đối với regex nếu bạn muốn chấp nhận các giá trị như các tháng một chữ số.

+3

Chỉ cần một nhận xét để nói rằng regex này sẽ không phát hiện nếu ngày, tháng hoặc thời gian có giá trị vượt trội đến mức tối đa. Ví dụ: 2012-65-65 99:99:99 sẽ hoạt động. Bên cạnh đó regex là tuyệt vời! – darkheir

+0

Tôi đồng ý điều này không tốt để xác thực ngày –

+1

Cụm từ thông dụng được hiển thị không nhằm xác thực ngày tháng. Nó dự định kiểm tra * cú pháp * của một chuỗi để xem liệu nó có giống như nó có thể là một ngày hay không. Sau khi nhận được các giá trị, bạn có thể xác thực ngày đã cho bằng cách sử dụng các hàm thư viện ngày bình thường. –

6

http://regexlib.com/REDetails.aspx?regexp_id=610

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$


This RE validates both dates and/or times patterns. Days in Feb. are also validated for Leap years. Dates: in dd/mm/yyyy or d/m/yy format between 1/1/1600 - 31/12/9999. Leading zeroes are optional. Date separators can be either matching dashes(-), slashes(/) or periods(.) Times: in the hh:MM:ss AM/PM 12 hour format (12:00 AM - 11:59:59 PM) or hh:MM:ss military time format (00:00:00 - 23:59:59). The 12 hour time format: 1) may have a leading zero for the hour. 2) Minutes and seconds are optional for the 12 hour format 3) AM or PM is required and case sensitive. Military time 1) must have a leading zero for all hours less than 10. 2) Minutes are manditory. 3) seconds are optional. Datetimes: combination of the above formats. A date first then a time separated by a space. ex) dd/mm/yyyy hh:MM:ss


Sửa: Hãy chắc chắn rằng bạn sao chép RegEx từ trang web regexlib.com như StackOverflow đôi khi loại bỏ/hủy diệt ký tự đặc biệt.

+0

Câu trả lời này cung cấp một biểu thức chính quy tốt, nhưng không phải là một câu trả lời cho câu hỏi actuall. Câu hỏi đặt ra là xác thực ngày được phân tách bằng dấu "-" chứ không phải "/" như câu trả lời này mô tả. –

21

Một phiên bản đơn giản mà sẽ làm việc cho các định dạng được đề cập, nhưng không phải tất cả những người khác theo @Espos:

(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) 
+0

cộng với một giải pháp đơn giản nhất! – chiliNUT

+0

Điều này xác nhận cả hai 0000-00-00 00:00:00 và 0000-00-00 00:00 (\ d {4}) - (\ d {2}) - (\ d {2}) (\ d {2}): (\ d {2})? ((:)? (\ D {2})? (2:)? (\ D {2})) – iRector

-1

Chức năng tiền tố PHP cần regex của bạn được bao bọc bằng ký tự phân cách, có thể là bất kỳ ký tự nào. Bạn không thể sử dụng ký tự dấu tách này mà không cần thoát trong regex. Điều này sẽ hoạt động (ở đây ký tự delimiter là /):

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45'); 

// or this, to allow matching 0:00:00 time too. 
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45'); 

Nếu bạn cần khớp các dòng chỉ chứa ngày giờ, thêm^và $ ở đầu và cuối của regex.

preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45'); 

Link to PHP Manual's preg_match()

0

liên quan đến Imran câu trả lời từ ngày 01 tháng 9 năm 2008 lúc 12:33 có một thiếu: trong mẫu các mô hình đúng là

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m1); 
print_r($m1); 
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m2); 
print_r($m2); 
preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45', $m3); 
print_r($m3); 

này trả

Array ([0] => 2008-09-01 12:35:45) 
Array ([0] => 2008-09-01 12:35:45) 
Array ([0] => 2008-09-01 12:35:45) 
1
^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1]))$|^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1])\s([0-1]\d|[2][0-3])\:[0-5]\d\:[0-5]\d)$ 
3
$date = "2014-04-01 12:00:00"; 

preg_match('/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/',$date, $matches); 

print_r($matches); 

$ trận đấu sẽ là:

Array ( 
    [0] => 2014-04-01 12:00:00 
    [1] => 2014 
    [2] => 04 
    [3] => 01 
    [4] => 12 
    [5] => 00 
    [6] => 00 
) 

Một cách dễ dàng để phá vỡ một chuỗi datetime formated.

-1

Đây là phiên bản được đơn giản hóa (có nguồn gốc từ câu trả lời của Espo). Nó kiểm tra tính chính xác của ngày (thậm chí năm nhuận), và hh: mm: ss là không bắt buộc
Ví dụ làm việc:
- 31/12/2003 11:59:59
- 29-2-2004

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))(|([01]\d|2[0-3])(:[0-5]\d){1,2})?$ 
0

đây là giải pháp của tôi:

/^(2[0-9]{3})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01]) (0[0-9]|1[0-9]|2[0123])\:([][0-9])\:([][0-9])$/u 
0

tôi đã sửa đổi mẫu biểu thức chính từ http://regexlib.com/REDetails.aspx?regexp_id=610. Mẫu sau phải khớp với trường hợp của bạn.

^(?=\d)(?:(?:1[6-9]|[2-9]\d)?\d\d([-.\/])(?:1[012]|0?[1-9])\1(?:31(?<!.(?:0[2469]|11))|(?:30|29)(?<!.02)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$ 

YYYY-MM-DD HH: MM: SS

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