【问题标题】:PHP preg_match year validation 1900 to 2019PHP preg_match 年份验证 1900 到 2019
【发布时间】:2019-03-03 07:10:36
【问题描述】:

我正在尝试验证 dd-mm-yyyy 格式的日期,其中年份应该在 1900 年到 2019 年之间。

日期和月份部分工作正常,但我在年份部分失败。你能帮忙吗?

$date="31-12-2020";

if (preg_match("/^(0[1-9]|[1-2][0-9]|3[0-1])-(0[1-9]|1[0-2])-(19[0-9]{2}|20([0-1]|[0-9]){2})$/",$date)) {
        echo 'True';
    return true;
} else {
        echo 'False';
    return false;
}

【问题讨论】:

  • 这是验证日期的不好方法,例如,如果您有 30-02-2019,它仍然是正确的;使用字符串到时间函数,转换日期格式,然后可以正确验证日期范围
  • 为什么要使用正则表达式?

标签: php regex preg-match


【解决方案1】:

这是您需要的完整脚本;如果给定日期在范围内,函数将返回 true 或 false:

http://sandbox.onlinephpfunctions.com/code/c0e8108319a24ae5ecf993bb940e1f30aab53fc7

$start_date = '01-01-1900';
$end_date = '01-01-2019';
$date_from_user = '01-01-2018';

check_in_range($start_date, $end_date, $date_from_user);


function check_in_range($start_date, $end_date, $date_from_user,$format='d-m-Y')
{
  // Convert to timestamp
  $start_ts = DateTime::createFromFormat($format,$start_date);
  $end_ts = DateTime::createFromFormat($format,$end_date);
  $user_ts = DateTime::createFromFormat($format,$date_from_user);

  // Check that user date is between start & end
  return (($user_ts >= $start_ts) && ($user_ts <= $end_ts));
}

【讨论】:

    【解决方案2】:

    用于处理 2000 年至 2019 年的当前年份部分 20([0-1]|[0-9]){2} 只需稍作修改即可使其正确。年份部分的第三位数字只能是01,因此它可以写为[01],第四位数字可以是任何数字,因此可以写为[0-9],这给了我们20[01][0-9]。以下是您可以使用的修改后的正则表达式,

    ^(0[1-9]|[1-2][0-9]|3[0-1])-(0[1-9]|1[0-2])-(19[0-9]{2}|20[01][0-9])$
    

    Demo

    此外,由于您只是在验证您的文本,您可以将所有组转换为非捕获组,以提高性能。

    ^(?:0[1-9]|[1-2][0-9]|3[0-1])-(?:0[1-9]|1[0-2])-(?:19[0-9]{2}|20[01][0-9])$
    

    Demo with non-capturing group

    【讨论】:

      【解决方案3】:

      这个认为年份的表达式应该如下

      19[0-9][0-9] | 20[0-1][0-9]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-02
        • 2012-01-02
        • 2014-01-20
        • 1970-01-01
        • 2011-11-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多