我正在尝试以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;
}
答案 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}
,只需对其进行少许修改即可使其正确。年部分的第三位数字只能是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])$
答案 2 :(得分:0)
该思考年份的表达式应如下
19[0-9][0-9] | 20[0-1][0-9]