验证不同的日期格式

时间:2015-09-29 19:50:05

标签: php regex validation

我遇到麻烦,我需要验证与不同日期格式一致的日期,例如

18-11-1991
1991-11-18
18/11/1991
1991/11/18

我需要验证日期是否为字符串,匹配这4种格式中的任何一种,如果没有,发送错误但我无法思考如何,寻找用于其中一种格式的验证方法,我碰巧复制了4但是只有差异是1而不是4?请帮忙。

1 个答案:

答案 0 :(得分:2)

这不是一个完整的日期检查,因为它可以构建无效的日期,但也许它足以满足您的目的(并且当没有值时,它无法检测日期和月份的格式,反之亦然大于12 - 在我的代码中也没有值更大19)。我只是将所有格式转换为iso日期,因为它有利于排序或与mysql一起使用:

$dates = array();
$dates[] = "18-11-1991";
$dates[] = "1991-11-18";
$dates[] = "18/11/1991";
$dates[] = "1991/11/18";
$dates[] = "1991 11 18";

foreach($dates as $date) {
    $iso_date = "";
    if(preg_match("/^([0-3][0-9])-([0-1][0-9])-([0-9]{4})\$/",$date,$reg)) {
        $iso_date = $reg[3]."-".$reg[2]."-".$reg[1];
    } elseif(preg_match("/^([0-9]{4})-([0-1][0-9])-([0-3][0-9])\$/",$date,$reg)) {
        $iso_date = $date;
    } elseif(preg_match("/^([0-3][0-9])\/([0-1][0-9])\/([0-9]{4})\$/",$date,$reg)) {
        $iso_date = $reg[3]."-".$reg[2]."-".$reg[1];
    } elseif(preg_match("/^([0-9]{4})\/([0-1][0-9])\/([0-3][0-9])\$/",$date,$reg)) {
        $iso_date = $reg[1]."-".$reg[2]."-".$reg[3];
    }
    if(empty($iso_date)) {
        echo "<br>ERROR: date $date doesn't match one of the supported formats.";
    } else {
        echo "<br>$date = $iso_date";
    }
}

这将输出:

18-11-1991 = 1991-11-18
1991-11-18 = 1991-11-18
18/11/1991 = 1991-11-18
1991/11/18 = 1991-11-18
ERROR: date 1991 11 18 doesn't match one of the supported formats.

编辑:如果您愿意,可以在iso_date上添加支票(如果它是有效日期):

$p = explode("-",$iso_date);
if(count($p)==3 and checkdate($p[1],$p[2],$p[1])) {
    echo " (date is valid)";
}