为了检查我的表格中的生日日期(格式:dd/mm/yyyy),我使用了这段代码,它工作正常。
if (!preg_match("/([012]?[1-9]|[12]0|3[01])'/(0?[1-9]|1[012])'/([0-9]{4})/",$date)){
$error[1]= "Insert a valid date";
}
但是当我想检查格式为 mm/yyyy 的日期并使用此代码时,它不再起作用。例如,当我尝试将 33/2014 放入我的输入中时,我的 php 验证不会将其显示为错误。
if (!preg_match("/(0?[1-9]|1[012])'/([0-9]{4})/",$date2)){
$error[2]= "Insert a valid date";
}
我哪里出错了?谢谢你的帮助。
您的正则表达式无效,即使它是正确的,您也可能在比较时遇到一些麻烦,因为在大多数情况下preg_match返回整数而不是布尔值。
简单且不那么干净的方式:
function checkMyDate($date) {
$components = explode('/', $date);
if(count($components) !== 2) return false;
return checkdate($components[0], 1, $components[1]);
}
可能的首选选项:
但是,php 具有处理日期的内置功能。如果DateTime
可以处理给定的字符串,您应该没问题:
function checkDateByFormat($date, $format = 'n/Y') {
$t = 'DateTime::createFromFormat($format, $date);
if($t === false) {
return false;
}
return $t->format($format) === $date;
}
var_dump(checkDateByFormat('12/2014')); // true
var_dump(checkDateByFormat('13/2014')); // false
var_dump(checkDateByFormat('12/20149')); // false
var_dump(checkDateByFormat('1/e1')); // false
var_dump(checkDateByFormat('7/1982')); // true
与这篇文章相关,但取自我自己的代码转储器。
基于
Tim 的基于检查日期的解决方案:
日、月和年的提取可以使用爆炸轻松完成,如下所示:
list($dd,$mm,$yyyy) = explode('/',$cnt_birthday);
if (!checkdate($mm,$dd,$yyyy)) {
$error = true;
}