PHP preg_match年度验证1900年至2019年

问题描述 投票:1回答:3

我正在尝试以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;
}
php regex preg-match
3个回答
4
投票

这是您需要的完整脚本;如果给定的日期在范围内,函数将返回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));
}

0
投票

您当前的年份部分20([0-1]|[0-9]){2}处理2000年至2019年只需要很少的修改,以使其正确。年份中的第三个数字部分只能是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


-1
投票

这个思考年的表达应如下所示

19[0-9][0-9] | 20[0-1][0-9]
© www.soinside.com 2019 - 2024. All rights reserved.