为此,最好使用另一种机制。
现代解决方案,使用日期时间:
$dt = DateTime::createFromFormat("Y-m-d", $date);
return $dt !== false && !array_sum($dt::getLastErrors());
这也验证了输入:确保日期可以用指定的格式解析,并且技巧是确保PHP没有进行“月移”的简洁方法(例如,考虑1月32日是2月1日)。有关详细信息,请参阅 DateTime::getLastErrors()。$dt !== falsearray_sum
带有爆炸和检查日期的老式解决方案:
list($y, $m, $d) = array_pad(explode('-', $date, 3), 3, 0);
return ctype_digit("$y$m$d") && checkdate($m, $d, $y);
这将验证输入是否也是有效日期。当然,你可以用正则表达式来做到这一点,但这会更加大惊小怪 - 而且2月29日根本无法用正则表达式进行验证。
这种方法的缺点是,您必须非常小心地拒绝所有可能的“坏”输入,同时在任何情况下都不会发出通知。操作方法如下:
-
explode限制为返回 3 个令牌(因此,如果输入为“1-2-3-4”,则将变为“3-4”)$d
-
ctype_digit用于确保输入不包含任何非数字字符(破折号除外)
-
array_pad,以确保返回足够的元素,以便如果输入为“1-2”,则不会发出通知checkdatelist()