我正在尝试以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;
}
这是您需要的完整脚本;如果给定的日期在范围内,函数将返回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));
}
您当前的年份部分20([0-1]|[0-9]){2}
处理2000年至2019年只需要很少的修改,以使其正确。年份中的第三个数字部分只能是0
或1
因此它可以写成[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])$
此外,由于您只是验证文本,因此您可以将所有组转换为非捕获组,以使性能更好一些。
^(?:0[1-9]|[1-2][0-9]|3[0-1])-(?:0[1-9]|1[0-2])-(?:19[0-9]{2}|20[01][0-9])$
这个思考年的表达应如下所示
19[0-9][0-9] | 20[0-1][0-9]