PHP preg_match结合checkdat

时间:2017-03-01 22:29:50

标签: php preg-match

我的Web应用程序中间有这段代码。

  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是有效日期或者TBD'的任意组合。该声明按预期验证。无效日期进入函数时出现问题。

例如,

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

使用此输入,我希望preg_match能够捕获它并将其从if语句中删除。相反,它运行try-except和php抛出一个非形成的数字错误。我在这里做错了什么想法?我确定它与我的preg_match声明有关。

4 个答案:

答案 0 :(得分:3)

将正则表达式更改为需要匹配,直到输入字符串结束:

/^[-0-9]+$/

所以添加+表示你可以有多个数字和连字符,然后$说前一个模式必须匹配,直到字符串结尾,所以不能添加任何其他模式就像你的例子。当然,您可以查找更复杂的正则表达式,检查日期的有效部分,连字符的数量等等,这些变得非常复杂,如this answer中所示。

答案 1 :(得分:0)

您的preg_match会检查$strDate是否以数字开头 - 而不是日期格式是否正确...由于03-01-2017asdf以数字开头,因此条件为{{ 1}}。

对于给定的日期格式(TRUE),您可以使用以下代码:

MM-DD-YYYY

答案 2 :(得分: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

答案 3 :(得分: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
    ...
}

希望它有所帮助。