我想验证一个字符串,看它是否是格式为YYYY-MM-DD的有效日期。我对正则表达式不是很了解,但是我设法让它在开头跟随连字符,然后是两个0-9个字符,另一个连字符和另外两个0-来验证字符串,其中包含四个0-9个字符。最后有9个字符。我如何才能使这个正则表达式的匹配日期在一个月内只有1-12,在一天中只有1-31?
这是我到目前为止所拥有的:
([0-9]{4})-([0-9]{2})-([0-9]{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)
此验证中最重要的是您使用^
和$
锚点来阻止子字符串在输入中间匹配。
至于正则表达式,这就是我的建议(假设多年以1
或2
开头)
^([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的数字,后跟0
或31
< / LI>
$
锚点断言我们位于字符串的末尾