用于检查日期的 PHP 正则表达式采用 YYYY-MM-DD 格式

2022-08-30 07:07:30

我正在尝试检查最终用户输入的日期是否在 YYYY-MM-DD 中。正则表达式从来都不是我的强项,我不断得到一个错误的返回值,用于我设置的preg_match()。

所以我假设我已经把正则表达式弄得一团糟,详见下文。

$date="2012-09-12";

if (preg_match("^[0-9]{4}-[0-1][0-9]-[0-3][0-9]$",$date))
    {
        return true;
    }else{
        return false;
    }

有什么想法吗?


答案 1

试试这个。

$date="2012-09-12";

if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date)) {
    return true;
} else {
    return false;
}

答案 2

为此,最好使用另一种机制。

现代解决方案,使用日期时间

$dt = DateTime::createFromFormat("Y-m-d", $date);
return $dt !== false && !array_sum($dt::getLastErrors());

这也验证了输入:确保日期可以用指定的格式解析,并且技巧是确保PHP没有进行“月移”的简洁方法(例如,考虑1月32日是2月1日)。有关详细信息,请参阅 DateTime::getLastErrors()。$dt !== falsearray_sum

带有爆炸检查日期的老式解决方案:

list($y, $m, $d) = array_pad(explode('-', $date, 3), 3, 0);
return ctype_digit("$y$m$d") && checkdate($m, $d, $y);

这将验证输入是否也是有效日期。当然,你可以用正则表达式来做到这一点,但这会更加大惊小怪 - 而且2月29日根本无法用正则表达式进行验证。

这种方法的缺点是,您必须非常小心地拒绝所有可能的“坏”输入,同时在任何情况下都不会发出通知。操作方法如下:

  • explode限制为返回 3 个令牌(因此,如果输入为“1-2-3-4”,则将变为“3-4”)$d
  • ctype_digit用于确保输入不包含任何非数字字符(破折号除外)
  • array_pad,以确保返回足够的元素,以便如果输入为“1-2”,则不会发出通知checkdatelist()

推荐