如何使这个日期正则表达式更严格?

时间:2014-07-20 23:13:35

标签: regex date

我想验证一个字符串,看它是否是格式为YYYY-MM-DD的有效日期。我对正则表达式不是很了解,但是我设法让它在开头跟随连字符,然后是两个0-9个字符,另一个连字符和另外两个0-来验证字符串,其中包含四个0-9个字符。最后有9个字符。我如何才能使这个正则表达式的匹配日期在一个月内只有1-12,在一天中只有1-31?

这是我到目前为止所拥有的:

([0-9]{4})-([0-9]{2})-([0-9]{2})

2 个答案:

答案 0 :(得分:1)

一种简单的方法:

$pattern = '~\A(\d{4})-(\d{2})-(\d{2})\z~';

if (preg_match($pattern, $str, $m) && checkdate($m[2], $m[3], $m[1])) {
    // TRUE
} else {
    // FALSE
}

优点是checkdate检查日期是否存在(包括闰年的情况)。使用这种方法,不需要将更多任务委托给正则表达式部分。

答案 1 :(得分:0)

首先是锚点

此验证中最重要的是您使用^$锚点来阻止子字符串在输入中间匹配。

至于正则表达式,这就是我的建议(假设多年以12开头)

^([12][0-9]{3})-(0[1-9]|1[012])-([012][1-9]|[123]0|31)$

regex demo测试正则表达式的日期部分,而this other demo测试月份部分。

<强>解释

  • ^锚点断言我们位于字符串的开头
  • 对于这一年,[12][0-9]{3}匹配1或2后跟三位数
  • 本月,(0[1-9]|1[012]匹配0,然后是1到9,或1匹配0,1或2
  • 当天,[012][1-9]|[123]0|31匹配0,1或2,后跟1到9或1,2或3的数字,后跟031 < / LI>
  • $锚点断言我们位于字符串的末尾