Php 日期验证年月日或年月日

Php 日期验证年月日或年月日,php,regex,Php,Regex,我从dd-mm-yyyy或dd/mm/yyyy格式的文本区域获取日期(允许用户使用-或/)如何检查(使用正则表达式或php)日期是否有效?到目前为止,是否有一种正则表达式或php方法可以验证这种格式的日期?我尝试在这里搜索,但什么也找不到。由于月份天数不同,特别是闰年,单用正则表达式无法验证日期 /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{2}|\d{4})$/ 但上面的正则表达式解决了允许或/基于这些格式dd-mm-yyyy或dd/mm/yyyy的问题 这里有一些例子 /

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

由于月份天数不同,特别是闰年,单用正则表达式无法验证日期

/^(\d{1,2})(\/|-)(\d{1,2})\2(\d{2}|\d{4})$/
但上面的正则表达式解决了允许或/基于这些格式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])'

由于月数不同,特别是闰年,单用正则表达式无法验证日期

/^(\d{1,2})(\/|-)(\d{1,2})\2(\d{2}|\d{4})$/
但上面的正则表达式解决了允许或/基于这些格式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])'

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

$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
}

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

$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
}

我会使用strftime和strptime。首先,我将字符串转换为“时间”,然后再转换为字符串并进行比较…

我将使用strftime和strptime。首先,我将字符串转换为“时间”,而不是转换回字符串并进行比较…

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

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

编辑: 您需要先切换订单,然后才能使用
strotime
检查日期是否有效,如下所示:

$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

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

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

编辑: 您需要先切换订单,然后才能使用
strotime
检查日期是否有效,如下所示:

$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
重新组装零件,然后运行检查日期

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

重新组装零件,然后运行检查日期

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

我想出了这个小功能,它检查您使用的格式是
DD(分隔符)MM(sameseparator)yyy

以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);
}
函数有效日期($input\u date){
如果(!preg_match('/(?P\d{2})(?P\d)(?P\d{2})\2(?P\d{4})/',$input_date,$aux_date))
返回false;
$aux=mktime(0,0,0,$aux_日期['m'],$aux_日期['d'],$aux_日期['y']);
返回$input_date==date('d'.$aux_date['sep'].'m'.$aux_date['sep'].'Y',$aux);
}

(如下所示编辑)

我想出了这个小功能,它检查您是否使用了格式
DD(分隔符)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);
}
函数有效日期($input\u date){
如果(!preg_match('/(?P\d{2})(?P\d)(?P\d{2})\2(?P\d{4})/',$input_date,$aux_date))
返回false;
$aux=mktime(0,0,0,$aux_日期['m'],$aux_日期['d'],$aux_日期['y']);
返回$input_date==date('d'.$aux_date['sep'].'m'.$aux_date['sep'].'Y',$aux);
}
(编辑如下所示)

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

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

'/^(?=\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})?$/'
这就行了


这将做生意。

这也将允许
5/2/02
,即它不符合要求。至少你应该提及它。这不会检查日期是否有效。这也将允许
5/2/02
,即它不符合要求。至少你应该提及它。这不会检查日期是否有效。
strtotime()
不处理dd/MM/YYY
回显日期('r',strotime('07/31/2010'));//2010年7月31日星期六00:00-0700
在调用strotime()之前,需要将日期字符串转换为MM/dd/yyyy或MM-dd-yyyyy.1用于strotime,但请确保将其设置为您的用户可以使用US日期格式,或者尝试为他们使用US日期格式。1此答案完全错误。(1)
strotime()
不支持
mm-dd-YYYY
,只有
mm/dd/YYYY
(2)
strotime()
不验证日期。
strotime('2010年2月31日')
例如,不会返回false。Cups的答案是正确的。哇,这是一个丑陋的正则表达式还是什么?讽刺的是,你没有投票给所有人,不是吗?
strotime()
不处理dd/MM/yyyy
回音日期('r',strotime('07/31/2010')));//Sat,2010年7月31日00:00:00-0700
在调用strotime()之前,您需要将日期字符串转换为mm/dd/yyyy或mm-dd-yyyyy。strotime()的+1,但请确保将其设置为您的用户使用US date格式,或者尝试将其作为一种后备方法。1此答案完全错误。(1)
strotime()
不支持
mm-dd-Y