11

我想用正则表达式验证时间。我创建了以下表达式:

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

这是问题所在:

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

有人知道出了什么问题吗?

4

4 回答 4

30

24 小时格式正则表达式模式中的时间:

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

24 小时时钟格式是从 0-23 或 00-23 开始,然后是分号 (:),然后是 00-59(可选的是分号 (:),然后是 00-59)。

描述 :

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

匹配时间格式:

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

不匹配时间格式:

 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]

例子 :

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
于 2012-07-02T15:30:46.513 回答
6
^(([0-1][0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?)$

这将从 00:00 到 23:59 和 00:00:00 到 23:59:59。

于 2012-07-02T15:35:33.270 回答
2

Alternation 是一个低优先级运算符,因此将其包装在一个非捕获组中:

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

在此处查看演示。

于 2012-07-02T15:36:04.007 回答
1
/(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?/

这也将允许 00:00 或 00:00:00,这里的其他一些不允许。

它还将时间限制为 00:00:00 到 23:59:59 或 23:59,其他一些允许 24:00 或 25:00 等。

于 2018-03-27T13:15:39.503 回答