【问题标题】:is_date() is malfunctioningis_date() 出现故障
【发布时间】:2014-12-20 06:05:58
【问题描述】:

我有一个 php 方法来检查一个 传入的参数是一个日期。就是这样:

public function is_Date($str){ 
        if (is_numeric($str) ||  preg_match('^[0-9]^', $str)){  
            $stamp = strtotime($str);
            $month = date( 'm', $stamp ); 
            $day   = date( 'd', $stamp ); 
            $year  = date( 'Y', $stamp ); 
            return checkdate($month, $day, $year); 
        } 
        return false; 
}

然后,我这样试驾:

$var = "100%";

if(is_Date($var)){
   echo $var.' '.'is a date'; 
} 

$var = "31/03/1970";

if(is_Date($var)){
   echo $var.' '.'is a date'; 
}

$var = "31/03/2005";

if(is_Date($var)){
   echo $var.' '.'is a date'; 
}

$var = "31/03/1985";

if(is_Date($var)){
   echo $var.' '.'is a date'; 
}

请注意,每个 if 也有一个 else 语句,如:

else{
   echo $var.' '.'is not a date' 
}

输出:

100% is a Date
31/03/1970 is a Date
31/03/2005 is a Date
31/03/1985 is a Date

我的问题是,为什么 100% 显示为日期,为什么 31/03/1985 没有被读取为日期?

任何关于为什么会受到高度赞赏的线索,因为我在正则表达式方面不太专业

【问题讨论】:

  • 为什么不简单检查一下:is_numeric( strtotime($str) )
  • ^[0-9]^ 是什么意思?

标签: php regex date


【解决方案1】:

您在正则表达式字符串的末尾使用^^ 的含义是比较字符串的开头

另外,正如hjpotter92 建议的那样,您可以简单地使用is_numeric(strtotime($str))

你的函数应该是这样的:

public function is_Date($str){ 
    $str=str_replace('/', '-', $str);  //see explanation below for this replacement
    return is_numeric(strtotime($str)));
}

Documentation says:

m/d/yd-m-y 格式的日期通过查看各个组件之间的分隔符来消除歧义:如果分隔符是斜杠 (/),然后假设美国 m/d/y;而如果分隔符是破折号 (-) 或点 (.),则假定为欧洲 d-m-y 格式。

【讨论】:

  • ^ OP 是分隔符,您在 preg 函数中忘记了它。
  • 我已经让它工作了!新输出已停止将 100% 显示为日期,这是我计划的......
【解决方案2】:

我已经让它工作了!新输出已停止显示 100% 作为日期,这是我计划的。这是完成这项工作的最终代码 sn-p

public function is_Date($str){ 
    $str = str_replace('/', '-', $str);     
    $stamp = strtotime($str);
    if (is_numeric($stamp)){  
       $month = date( 'm', $stamp ); 
       $day   = date( 'd', $stamp ); 
       $year  = date( 'Y', $stamp ); 
       return checkdate($month, $day, $year); 
    }  
    return false; 
}
echo "A million thanks to you all ! you guys are the best !";

【讨论】:

  • 请不要添加相同的答案。您应该改为accept answer
猜你喜欢
  • 2016-07-19
  • 1970-01-01
  • 2015-05-23
  • 2012-12-08
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
相关资源
最近更新 更多