一尘不染

PHP preg_match与可使用的正则表达式

php

function validateDate( $date )
{
echo $date;
//2012-08-24 20:30:00
if(preg_match(‘/^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([1-2]{1})([0-9]{1}):([0-5]{1})([0-9]{1}):([0-5]{1})([0-9]{1})$/’, $date) >= 1)
{
return true;
}
else
{
return false;
}
}

这总是返回false。我使用了唯一的工具来构建正则表达式,并且在那里工作正常。当我在正则表达式中添加“
/”时,麻烦开始了。PHP似乎以某种方式要求这些,但是我不知道为什么,我也不知道为什么它破坏了我的正则表达式。

它应该返回TRUE。例如“ 2012-08-24 20:30:00”,而对于“ asdf2012-08-24
20:30:00asdf”则为FALSE,或者不符合我的正则表达式的内容

提前致谢!

-----------------------编辑感谢您的所有回答!

正如一些用户指出的那样,我的函数针对示例日期“ 2012-08-24 20:30:00”返回true。但是,只有当我手动设置$ date
=‘2012-08-24 20:30:00’时,它才能执行该操作。如果我在代码的其他位置使用完全相同的字符串调用该函数,则返回false。有人知道为什么吗?

----------------------- EDIT2

是的,很抱歉浪费您的时间,实际上是在字符串中添加了一些空格。在调用我的函数之前在日期上使用trim()可以得出正确的结果。

谢谢大家!


阅读 344

收藏
2020-05-26

共1个答案

一尘不染

为什么要使用正则表达式?使用DateTime类。

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

您可以将此功能用于所有类型的日期/时间验证。例子:

var_dump(validateDate('2012-02-28 12:12:12')); # true
var_dump(validateDate('2012-02-30 12:12:12')); # false
var_dump(validateDate('2012-02-28', 'Y-m-d')); # true
var_dump(validateDate('28/02/2012', 'd/m/Y')); # true
var_dump(validateDate('30/02/2012', 'd/m/Y')); # false
var_dump(validateDate('14:50', 'H:i')); # true
var_dump(validateDate('14:77', 'H:i')); # false
var_dump(validateDate(14, 'H')); # true
var_dump(validateDate('14', 'H')); # true

var_dump(validateDate('2012-02-28T12:12:12+02:00', 'Y-m-d\TH:i:sP')); # true
# or
var_dump(validateDate('2012-02-28T12:12:12+02:00', DateTime::ATOM)); # true

var_dump(validateDate('Tue, 28 Feb 2012 12:12:12 +0200', 'D, d M Y H:i:s O')); # true
# or
var_dump(validateDate('Tue, 28 Feb 2012 12:12:12 +0200', DateTime::RSS)); # true
var_dump(validateDate('Tue, 27 Feb 2012 12:12:12 +0200', DateTime::RSS)); # false
# ...
2020-05-26