正则表达式匹配日期和时间

时间:2013-05-09 17:48:09

标签: php regex

我正在尝试在PHP的正则表达式中匹配特定的日期时间格式:

dd-mm-YYYY HH:ii:ss

应始终采用该格式。这意味着,例如,当它是该月的第一天时,必须有一个前导零。 E.g:

01-01-2013 01:01:01

我尝试了以下模式:

^[0-12]{2}-[0-31]{2}-[0-9]{4} [0-23]{2}:[0-59]{2}:[0-59]{2}$

但上述模式在时间戳上失败,例如:09-05-2013 19:45:10

http://rubular.com/r/eGBAhwiNCR

我知道这可能不是验证这样的日期时间的正确方法,但我真的想知道上面的错误。

4 个答案:

答案 0 :(得分:7)

[0-12]{2}0之前的数字12不匹配。相反,它是一个允许01的字符类以及数字2。随后的量词只允许重复那些,重复两次,重复0,1或2。

您的其他占位符遵循相同的无效方案。

如果你不能谷歌更好的正则表达式,最好诉诸\d{2}\d{4}。更好的是,只需使用DateTime来验证格式。

答案 1 :(得分:1)

问题是当您检查“范围”时,例如开始时为[0-12]。这是一个字符类,它告诉正则表达式匹配0到1,然后是2.所以如果你在第一个之后添加更多的数字,它就不会像你期望的那样工作。稍微更改正则表达式(专注于[0-12]首字母)[0-319]{2}-[0-12]{2}-[0-9]{4} [0-23]{2}:[0-59]{2}:[0-59]{2}$,将与09-01-2011 11:11:10匹配。

确保每个空间都有有效数字需要在框外思考。正则表达式:

(0[1-9]|[12][\d]|3[0-2])-(0[1-9]|1[0-2])-[\d]{4} (0[1-9]|1[\d]|2[0-3]):(0[1-9]|[1-5][\d]):(0[1-9]|[1-5][\d])$

将适用于您对regex you attempted所期望的内容。

如果你把它分解成更小的部分就有意义了(开头看起来真的很可怕)。看第一件(“天”0-31)。

(0[1-9]|[12][\d]|3[0-2])

这是使用或处理3种不同的情况。

  1. 0[1-9] - 零后跟1-9之间的任何数字。我们不希望[0-9]{2},因为这会允许00之类的数字。因此,如果数字以0开头并且后面有任何其他数字(单位数天),则该数字有效。
  2. [12][\d] - 1 or 2后跟任意数字。这允许数字10-29有效。
  3. 3[0-2] - 3后跟任意02匹配303132。< / LI>

    分解,这不是太糟糕但是这个模式随后会在你日期的每个“字段”中执行。因此,此正则表达式验证每个字段是否有效......但可能需要更好的方法来确认有效日期。 如果你可以30-02例如,2月没有30天,那么检查是否复杂。

答案 2 :(得分:0)

^[0-9]{2}-[0-9]{2}-[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}$

答案 3 :(得分:0)

验证的例子是在php中,但正则表达式是标准的

enable_if