PHP - preg_match验证日期格式mm / yyyy

时间:2014-12-05 17:48:09

标签: php forms preg-match

为了检查我的表单中的生日日期(格式: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";
}

我哪里出错了?谢谢你的帮助。

2 个答案:

答案 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;
}