PHP preg_match年度验证1900至2019

时间:2019-03-03 07:10:37

标签: php regex preg-match

我正在尝试以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;
}

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

您要处理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

答案 2 :(得分:0)

该思考年份的表达式应如下

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