【发布时间】:2014-07-24 08:40:56
【问题描述】:
我有这个用于验证日期格式的 php 函数:
function _CHECK_DATEFORMAT_($date, $format='YYYY/MM/DD')
{
switch( $format )
{
case 'YYYY/MM/DD':
case 'YYYY-MM-DD':
list( $y, $m, $d ) = preg_split( '/[-\.\/ ]/', $date );
break;
case 'YYYY/DD/MM':
case 'YYYY-DD-MM':
list( $y, $d, $m ) = preg_split( '/[-\.\/ ]/', $date );
break;
case 'DD-MM-YYYY':
case 'DD/MM/YYYY':
list( $d, $m, $y ) = preg_split( '/[-\.\/ ]/', $date ); //3715 LINE
break;
case 'MM-DD-YYYY':
case 'MM/DD/YYYY':
list( $m, $d, $y ) = preg_split( '/[-\.\/ ]/', $date );
break;
case 'YYYYMMDD':
$y = substr( $date, 0, 4 );
$m = substr( $date, 4, 2 );
$d = substr( $date, 6, 2 );
break;
case 'YYYYDDMM':
$y = substr( $date, 0, 4 );
$d = substr( $date, 4, 2 );
$m = substr( $date, 6, 2 );
break;
default:
throw new Exception( "Invalid Date Format" );
}
return checkdate( $m, $d, $y ); //3738 Line
}
代码输出:
echo validateDate( '2007-21-04', 'YYYY-DD-MM' ) ? 'good'. "\n" : 'bad' . "\n";
这有效,但如果用户输入无效的日期字符这样:
echo validateDate( '2007*2104', 'YYYY-DD-MM' ) ? 'good'. "\n" : 'bad' . "\n";
echo validateDate( 'test', 'YYYY-DD-MM' ) ? 'good'. "\n" : 'bad' . "\n";
我看到错误:
Notice: Undefined offset: 2 in C:\xampp\htdocs\cms\functions.php on line 3715
Notice: Undefined offset: 1 in C:\xampp\htdocs\cms\functions.php on line 3715
Warning: checkdate() expects parameter 2 to be long, string given in C:\xampp\htdocs\cms\functions.php on line 3738
在检查验证日期格式之前如何验证字符?
【问题讨论】:
-
你的 validateDate 函数在哪里?
-
function _CHECK_DATEFORMAT_($date, $format) { return !!DateTime::createFromFormat($format, $date); }- 如果您使用默认函数(如 createFromFormat),解析日期会更容易,它会解析格式并将日期时间返回给您,或者返回 false。无论哪种方式,!!都会将其转换为布尔值。 -
你真的应该更多地限制格式,并且只接受一种写日期的方式。它会让一切变得容易得多。
标签: php validation