为了检查我的表单中的生日日期(格式: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";
}
我哪里出错了?谢谢你的帮助。
答案 0 :(得分:1)
你的正则表达式是无效的,即使它是正确的,你可能会遇到一些麻烦,因为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
与this帖子相关,但是来自我自己的代码转储程序。
答案 1 :(得分:0)
基于Tim的基于checkdate的解决方案:
使用爆炸可以很容易地完成日,月和年的提取:
list($dd,$mm,$yyyy) = explode('/',$cnt_birthday);
if (!checkdate($mm,$dd,$yyyy)) {
$error = true;
}