日期验证dd-mm-yyyy或dd / mm / yyyy

时间:2010-09-26 11:15:12

标签: php regex

我从dd-mm-yyyy或dd / mm / yyyy格式的文本区域获取日期(允许用户使用 - 或/)如果日期是,我如何检查(使用正则表达式或php)有效?到目前为止,是否有一个正则表达式或php方法来验证这种格式的日期?我试着在这里搜索但找不到任何东西。

8 个答案:

答案 0 :(得分:11)

$date = str_replace("/", "-", $incoming);
$d = explode("-"  , $date);

重新组装零件,然后通过checkdate运行

if( !checkdate($d[1], $d[0], $d[2]) )
echo 'Not a recognised date' ;

http://www.php.net/manual/en/function.checkdate.php

答案 1 :(得分:2)

我想出了这个小功能,它检查你使用格式DD(separator)MM(sameseparator)YYYY

以DD,MM和YYYY为整数。

function valid_date($input_date) {
    if(!preg_match('/(?P<d>\d{2})(?P<sep>\D)(?P<m>\d{2})\2(?P<y>\d{4})/',$input_date, $aux_date)) 
        return false; 
    $aux = mktime(0,0,0,$aux_date['m'],$aux_date['d'],$aux_date['y']);
    return $input_date == date('d'.$aux_date['sep'].'m'.$aux_date['sep'].'Y',$aux);
}

(在下面编辑为sugested)

答案 2 :(得分:1)

我强烈建议使用PHP方法strtotime(),因为它不仅会检查格式是否有效,而且格式指定的时间也是正确的(即永远不会有2月31日,但正则表达式可能无法捕捉到这一点。)

您可以查看这是否对if (strtotime($toCheck)) {有效,因为如果不成功,它将返回FALSE(http://us2.php.net/strtotime).

修改 您需要先切换订单,然后才能首先检查日期是否有效strtotime

$str = "07-31-1987";
$str = preg_replace('/([^-\/]+)[-\/]([^-\/]+)[-\/]([^-\/]+)/', '$2-$1-$3', $str);
echo date('r', strtotime($str)) . "\n"; // Fri, 31 Jul 1987 00:00:00 -0700

答案 3 :(得分:0)

一种非常简单的方法是使用正则表达式检查其中一种格式,然后通过替换任何字符确保输入首先转换为:

$regexDate = '#\d\d\-\d\d\-\d\d\d\d#' ;

$dateIn = trim($_GET['date']) ;

//replace all / with - since our regex expects those
$dateIn = str_replace('/', '-', $dateIn) ;

if (preg_match($regexDate, $dateIn)) {
    //valid date input
}

答案 4 :(得分:0)

我会使用strftime和strptime。起初我将字符串转换为“时间”而不是回到字符串并进行比较......

答案 5 :(得分:0)

您可以使用datetime类,将要验证的日期传递给构造函数。如果您有一个有效的日期,您将获得一个日期时间对象。如果它是一个无效的日期,构造函数将抛出一个异常,你可以捕获它并相应地处理错误。

答案 6 :(得分:0)

'/^(?=\d)(?:(?:(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})|(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2}))($|\ (?=\d)))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$/'

这将做生意。

答案 7 :(得分:-1)

单独的正则表达式无法验证日期,因为月份的天数不同 - 尤其是闰年。

/^(\d{1,2})(\/|-)(\d{1,2})\2(\d{2}|\d{4})$/

但正则regex解决了你允许的问题 - 或/ /基于这些格式dd-mm-yyyy或dd / mm / yyyy

以下是一些例子

//Date d/m/yy and dd/mm/yyyy
//1/1/00 through 31/12/99 and 01/01/1900 through 31/12/2099
//Matches invalid dates such as February 31st
'\b(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)?[0-9]{2}\b'

//Date dd/mm/yyyy
//01/01/1900 through 31/12/2099
//Matches invalid dates such as February 31st
'(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)[0-9]{2}'

//Date m/d/y and mm/dd/yyyy
//1/1/99 through 12/31/99 and 01/01/1900 through 12/31/2099
//Matches invalid dates such as February 31st
//Accepts dashes, spaces, forward slashes and dots as date separators
'\b(0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2}\b'

//Date mm/dd/yyyy
//01/01/1900 through 12/31/2099
//Matches invalid dates such as February 31st
'(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)[0-9]{2}'

//Date yy-m-d or yyyy-mm-dd
//00-1-1 through 99-12-31 and 1900-01-01 through 2099-12-31
//Matches invalid dates such as February 31st
'\b(19|20)?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])\b'

//Date yyyy-mm-dd
//1900-01-01 through 2099-12-31
//Matches invalid dates such as February 31st
'(19|20)[0-9]{2}[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])'