如何在PHP中以格式d.m.Y - d.m.Y验证日期范围

时间:2018-01-07 11:35:29

标签: php regex date-range

我的字符串看起来像这样:

04.01.2018 - 20.01.2018

所以模式是:d.m.Y - d.m.Y

我认为REGEX将是首选。评论说不要使用REGEX。

有关如何验证它的任何建议吗?

1 个答案:

答案 0 :(得分:1)

正则表达式绝对不是这样。拆分字符串,并使用基于日期的方法来验证每个日期。

代码:(Demo

function valiDate($date,$format='d.m.Y'){
    $d=DateTime::createFromFormat($format,$date);
    return $d && $d->format($format)==$date;
}

function regex($date){
    return preg_match('/^\d{2}\.\d{2}\.\d{4} - \d{2}\.\d{2}\.\d{4}$/',$date);
}
/* or 
    function valiDate($date){
        $date=DateTime::createFromFormat('d.m.Y',$date);
        $date_errors=DateTime::getLastErrors();
        if($date_errors['warning_count'] || $date_errors['error_count']){
            return false;
        }
        return true;
    }
*/
// both valiDate functions from https://stackoverflow.com/questions/12030810/php-date-validation

$dateranges=[
    '04.01.2018 - 20.01.2018',
    '01.01.2017 - 01.02.201s',
    '00.00.0000 - 99.99.9999',
    "fish\t\t\t\t\t",
    '31.02.2018 - 31.03.2019',
    '12.13.2016 - 12.14.2016',
    '04.04.2018 - 04.04.2017'
];
foreach($dateranges as $daterange){  
    $dates=explode(' - ',$daterange,2);
    echo "($daterange}) ";
    echo 'valiDate: ',(isset($dates[1]) && valiDate($dates[0]) && valiDate($dates[1]))?'valid':'bonk';
    echo "\t-VS-\t";
    echo 'regex: ',regex($daterange)?'valid':'bonk';
    echo "\n";
}

输出:

(04.01.2018 - 20.01.2018}) valiDate: valid  -VS-    regex: valid
(01.01.2017 - 01.02.201s}) valiDate: bonk   -VS-    regex: bonk
(00.00.0000 - 99.99.9999}) valiDate: bonk   -VS-    regex: valid
(fish                   }) valiDate: bonk   -VS-    regex: bonk
(31.02.2018 - 31.03.2019}) valiDate: bonk   -VS-    regex: valid
(12.13.2016 - 12.14.2016}) valiDate: bonk   -VS-    regex: valid
(04.04.2018 - 04.04.2017}) valiDate: valid  -VS-    regex: valid

P.S。我添加了isset()调用以避免在explode()未生成两个元素时发出通知。