我正在编写一个PHP脚本,它接受用户输入的值,必须是这样的。
2011-06-17 00:00:00
...
2011-06-17 23:59:59
如何验证确实是正确的输入?
答案 0 :(得分:12)
或者,在输入上使用strtotime(),然后在date()中使用所需的格式。这具有验证用户提供正确日期而不仅仅是正确格式的优点。也就是说,当有人在2月31日投入时,正则表达式检查不会被捕获。
$date = strtotime($input);
if ($date === false) {
throw Exception('bad date');
}
$formatted = date('<whatever>', $date);
答案 1 :(得分:8)
您正在寻找ISO 8601的验证。
以下是验证该格式的示例正则表达式:
^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$
http://www.pelagodesign.com/blog/2009/05/20/iso-8601-date-validation-that-doesnt-suck/
或更好,
示例:
$validator = new Zend_Validate_Date(array('format' => 'yyyy-MM-dd HH:mm:ss'))
$validator->isValid('2011-06-17 00:00:00');
答案 2 :(得分:1)
使用DateTime::createFromFormat并检查返回值。
答案 3 :(得分:1)
/(\d{4}[\-]((0[1-9]|1[0-2]))[\-]((0[1-9]|1[0-9]|2[0-9]|3[0-1]))(([t-tT-T]|\s)((0[0-9]|1[0-9]|2[0-3]))[\:]((0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]))[\:]((0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]))([.][a-zA-Z0-9]*)?)?)$/i;
尝试
2013年6月28日 2013-06-28T13:35:59 2013-06-28 13:35:59 2013-06-28T13:35:59.000 2013-06-28 13:35:59.000 2013-06-28T13:35:59.000Z 2013-06-28 13:35:59.000Z
它没有简化,虽然它可以大大简化..
答案 4 :(得分:0)
使用正则表达式:http://php-regex.blogspot.com/和http://networking.ringofsaturn.com/Web/regex.php是开始学习的好地方
或使用此解决方案:
$exploded = explode($INPUT_STRING, " ");
$date_explode = explode($exploded[0],"-");
$time_explode = explode($exploded[1],":");
if (empty($date_explode[0])||empty($date_explode[1])||empty($date_explode[2])||empty($time_explode[0])||empty($time_explode[1])||empty($time_explode[2])) {
die ("ERROR! Not correct input format!");
}
答案 5 :(得分:0)
$date = strtotime('2011-13-17 23:00:00');
if($date){print("legal");}
答案 6 :(得分:0)
要完成日期/时间验证,请同时使用DateTime :: createFromFormat()和strtotime(),例如
// Convert it to test if the datetime can be successfully used. Finer than regex.
$dateformat = DateTime::createFromFormat('Y-m-d H:i:s', '2014-09-27 20:00:05');
$datereal = strtotime($inputStart);
if( $dateformat === FALSE || $datereal === FALSE )
echo "Invalid format/datetime".
如果您愿意,如果日期格式错误或根本不可能,您可以将支票分成不同的消息。