【问题标题】:PHP preg_match with working regex [duplicate]PHP preg_match与工作正则表达式[重复]
【发布时间】:2012-09-01 14:46:50
【问题描述】:
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() 现在可以得到正确的结果。

谢谢大家!

【问题讨论】:

  • 这不是您验证日期的方式。它将允许9999-99-99。虽然允许到 9999 年是一个很好的远见,但我不认为 90 年是一个真正的月份。
  • 考虑使用 strtotime() 或 DateTime 类而不是那个
  • 顺便说一句,/ 不是必需的——只有一些匹配的表达式分隔符。您可以使用|、~,或者如果您愿意,甚至可以使用字母数字字符,只要您在末尾匹配它(并转义表达式正文中使用的相同字符的实例)。
  • 该函数适用于您提供的示例日期。
  • Marc B - 也许我希望验证这些日期 Brian - 你能否详细说明我必须如何更改我的代码以使其正常工作?

标签: php preg-match


【解决方案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
# ...

【讨论】:

  • +1。我在回答here 中使用了这个。 :)
  • +1。我在回答here 中使用了这个。 :P
【解决方案2】:

为我返回true。试试这个正则表达式:

function validateDate($date) {
  echo $date;
  if( !preg_match("/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/",$date,$m)) return false;
  if( !checkdate($m[1],$m[2],$m[0])) return false;
  if( $m[3] > 23) return false;
  if( $m[4] > 59) return false;
  if( $m[5] > 59) return false;
  return true;
}

在 RegEx 中验证格式,然后使用目标函数验证内容,比尝试在 RegEx 中做所有事情更容易。

【讨论】:

  • 感谢您的回答。确实,当我手动设置 $date='2012-08-24 20:30:00' 时,我的函数返回 true,但是当我使用这个确切的字符串在代码中的其他地方调用函数时,它确实返回 FALSE,有什么想法吗?
  • 你确定字符串前后没有空格吗?甚至是不可打印的字符?字符串是从哪里来的?
【解决方案3】:

您要问的是分隔符。阅读 PHP.net 手册中的这篇文章:RegExp - Delimiters

在使用 PCRE 函数时,需要用 分隔符 将模式括起来。分隔符可以是任何非字母数字、非反斜杠、非空白字符。

还有:

常用的分隔符是正斜杠 (/)、井号 (#) 和波浪号 (~)。以下是有效分隔模式的所有示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    相关资源
    最近更新 更多