我从dd-mm-yyyy或dd / mm / yyyy格式的文本区域获取日期(允许用户使用 - 或/)如果日期是,我如何检查(使用正则表达式或php)有效?到目前为止,是否有一个正则表达式或php方法来验证这种格式的日期?我试着在这里搜索但找不到任何东西。
答案 0 :(得分:11)
$date = str_replace("/", "-", $incoming);
$d = explode("-" , $date);
重新组装零件,然后通过checkdate运行
if( !checkdate($d[1], $d[0], $d[2]) )
echo 'Not a recognised date' ;
答案 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])'