PHP-preg_匹配以验证日期格式mm/yyyy

PHP-preg_匹配以验证日期格式mm/yyyy,php,forms,preg-match,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

为了检查我表单中的生日(格式: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\u 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
与post相关,但取自我自己的代码转储程序。

基于Tim的解决方案:

使用explode as可轻松提取日、月和年:

list($dd,$mm,$yyyy) = explode('/',$cnt_birthday);
if (!checkdate($mm,$dd,$yyyy)) {
        $error = true;
}

“不起作用”通常需要一些具体化的示例输入。你的问题是关于缺少正则表达式开始/结束锚吗?一条注释:
preg_match
return
integer
boolean
(如果正则表达式中有错误),请阅读更多内容:我知道这与问题有关,只是一个相同的提示。@guilhermanascimento是正确的。即使你的正则表达式是正确的,你也可能得不到你想要的结果。通常来说,只有三个字段作为生日或某种日历比较容易/更好。然后你就知道这种格式正是你所期望的,因为日期的格式太多了,每个国家的做法都不一样。