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


PHP - preg_match to validate date format mm/yyyy

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