【问题标题】:validate invalid date character using php使用 php 验证无效的日期字符
【发布时间】: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


【解决方案1】:

试试这个:

没有DateTime 函数的更好的验证和格式化日期的类:

http://www.tonymarston.net/php-mysql/dateclass.html

或者

你可以使用 PHP 的 DateTime 类:

function validateDate($date)
{
    $d = DateTime::createFromFormat('Y/m/d', $date);
    return $d && $d->format('Y/m/d') == $date;
}

函数是从 answerphp.net 复制而来的

【讨论】:

  • 不要粗鲁,但该类是在 PHP 拥有更原生的 DateTime 类之前编写的,我们为什么要选择该类而不是提供更好支持和更快访问的内置类?跨度>
  • @scragar:我为这个 Q 分享这个(没有 PHP Native DateTime 类)。你说得对 DateTime 更好。
【解决方案2】:

date 传递的可能显然包含 1 或 2 个斜杠/减号,使得 list 分配不合适。

警告是因为 checkdate 需要整数参数。

return checkdate( intval($m), intval($d), intval($y) ); //3738 Line

【讨论】:

    【解决方案3】:

    您可以使用原生 php 类 DateTime 将具有特殊格式的日期字符串转换为日期

    function _CHECK_DATEFORMAT_($date, $format='YYYY/MM/DD')
       {
        switch( $format )
        {
            case 'YYYY/MM/DD':
                $n_format="Y/m/d";
                break;
            case 'YYYY-MM-DD':
                $n_format="Y-m-d";
                break;
            case 'YYYY/DD/MM':
                $n_format="Y/d/m";
                break;
            case 'YYYY-DD-MM':
                $n_format="Y-d-m";
                break;
            case 'DD-MM-YYYY':
                $n_format="d-m-Y";
                break;
            case 'DD/MM/YYYY':
                $n_format="d/m/Y";
                break;
            case 'MM-DD-YYYY':
                $n_format="m-d-Y";
                break;
            case 'MM/DD/YYYY':
                $n_format="m/d/Y";
                break;
            case 'YYYYMMDD':
                $n_format="Ymd";
                break;
            case 'YYYYDDMM':
                $n_format="Ydm";
                break;
            default:
            throw new Exception( "Invalid Date Format" );
        }
        $date=DateTime::createFromFormat($n_format, $date);
        if(!$date){
            throw new Exception('Invalid Date by format '.$format);
        }
        $m=$date->format('m');
        $d=$date->format('d');
        $y=$date->format('Y');
        return checkdate( $m, $d, $y ); //3738 Line
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-08
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      相关资源
      最近更新 更多