2017-03-01 75 views
1

我有这段代码在我的web应用程序的中间。PHP preg_match结合checkdat

if (preg_match ("/^[-0-9]/", $strDate) == TRUE) 
    { 
     $dateParts = explode("-", $strDate); 
     if (count($dateParts) === 3) 
     { 
      try 
      { 
       if (checkdate($dateParts[0], $dateParts[1], $dateParts[2]) === TRUE) 
       { 
        return TRUE; 
       } 
      } 
      catch (Exception $e) 
      { 
       //purposely blank for now. 
      } 
     } 
    } 

我没有任何包括周围的代码,因为它是一个相当漫长的应用程序。首先,$strDate变量我确切地知道那里是什么。我可以在if声明开始之前将其回显出来。如果$strDate是有效日期或“待定”的任意组合,则该语句按预期进行验证。当无效日期进入功能时,问题就来了。

例如,

$strDate = '03-01-2017asdf'; 

有了这个投入我期望preg_match赶上它,踢它出if声明。相反,它运行try-except,而php会抛出一个非形式的数字错误。任何想法我在这里做错了吗?我确信它与我的preg_match声明有关。

回答

3

改变你的正则表达式需要匹配,直到输入字符串的结尾:

/^[-0-9]+$/ 

所以添加+说你可以有多个数字和连字符,然后$说,以前的模式必须匹配,直到字符串结束,所以没有其他的东西可以像你的例子一样添加。当然,您可以查找更复杂的正则表达式来检查日期的有效部分,连字符的数量等等,这可能会变得相当复杂,正如您在this answer中看到的那样。

+1

很高兴你添加了'$'符号,但日期模式仍然可能会更好。 – MaxZoom

+0

是的,将日期匹配折叠成图案是下一步。我只是想先让这部分工作。这完全奏效!谢谢!我知道这是一个小小的错误,只是无法弄清楚。在这里和网络上搜索几个小时后,我放弃了,实际上问了一个问题。 –

+0

@MaxZoom,您是否阅读过我的答案? ;-) – trincot

0

preg_match检查$strDate是否以数字开头 - 不是日期格式是否完全正确。既然03-01-2017asdf以数字开头,病情结果TRUE

对于给定的日期格式(MM-DD-YYYY),您可以使用此代码:

if (preg_match ("/^(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])-[0-9]{4}$/", $strDate) == TRUE) 
0

我建议你来验证和格式化日期使用Carbon

这里的代码为例做什么你在你的功能:

use Carbon\Carbon; 
class DateHelper 
{ 
    /** 
    * @param $strDate valid format d-m-Y 
    */ 
    public static function validate($strDate) 
    { 
     try { 
      $carbon = Carbon::createFromFormat('d-m-Y', $strDate); 
      return true; 
     } catch (\Exception) { 
      //invalid date 
     } 

     return false; 
    } 

} 

var_dump(DateHelper::validate('03-01-2017asdf')); //return false 
var_dump(DateHelper::validate('03-01-2017')); //return true 
0

验证日期的最优雅和最短的方法是使用DateTime个php对象。

你可以建立你的函数是这样的:

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

功能,从这个answerphp.net

复制即:

var_dump(validateDate('03-01-2017asdf', 'm-d-Y')); // bool(false) 
var_dump(validateDate('03-01-2017', 'm-d-Y')); // bool(true) 

所以,您的验证条件将是这样的:

if (validateDate($strDate, 'm-d-Y')) { 
    ... 
    // Do some stuff 
    ... 
} 

希望它能帮助。