当前位置: 首页 > 知识库问答 >
问题:

PHP preg_与工作正则表达式匹配[重复]

汤昊
2023-03-14
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"和FALSE的"asdf2012-08-24 20:30:00asdf"或任何不符合我的正则表达式

提前谢谢!

-----------------------编辑谢谢你的所有答案!

正如一些用户指出的那样,对于示例日期“2012-08-24 20:30:00”,我的函数返回true。但是,只有当我手动设置$date='2012-08-24 20:30:00'时,它才会这样做。如果我使用完全相同的字符串调用代码中其他地方的函数,它将返回false。有人知道为什么吗?

-----------------------编辑

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

谢谢大家!

共有3个答案

蓝昊然
2023-03-14

这应该工作得更好,写得更简单:

function validateDate($date)
{
  return 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);
}

但是,如其他人所述,9999-99-99 29:59:59将返回true。。。

从PHP手册中,您可以轻松找到更优雅、更可靠的解决方案,例如(受此评论启发):

function validateDate($data)
{
    return (date('Y-m-d H:i:s', strtotime($data)) == $data);
}
邓开济
2023-03-14

为我返回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;
}

在正则表达式中验证格式,然后使用目标函数验证内容,比在正则表达式中尝试执行所有操作更容易。

孙昂然
2023-03-14

为什么要使用正则表达式?使用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
# ...
 类似资料:
  • 有没有人试图描述与正则表达式匹配的正则表达式? 由于重复的关键字,这个主题几乎不可能在网上找到。 它可能在实际应用程序中不可用,因为支持正则表达式的语言通常具有解析它们的方法,我们可以将其用于验证,以及一种在代码中分隔正则表达式的方法,可用于搜索目的。 但是我仍然想知道匹配所有正则表达式的正则表达式是什么样子的。应该可以写一个。

  • 我有一根线,比如: 如何匹配每行的最后一个?顺便说一句,这是我试图在Sublime的文本中做到的。这些值不一致,就像我在这里看到的,我有几百行要替换。 我尝试了,但这与相匹配。

  • 问题内容: 我试图创建下面的正则表达式:返回之间的字符串和(或或)从下列字符串RNA: ,让所有的比赛会被发现,包括重叠的。 我尝试了几种正则表达式,最后得到了类似的结果: 您能告诉我我的正则表达式模式中的错误吗? 问题答案: 用一个正则表达式执行此操作实际上是非常困难的,因为大多数用法 都不 希望重叠匹配。但是,您可以通过一些简单的迭代来做到这一点: 虽然,这有一些问题。您希望得到的回报是什么?

  • 这是我的问题。我有这个: 然而,它并不匹配。为什么?我试图检索括号内的数字。 我应该尝试什么?

  • 我们得到了一些这样的内容:

  • 我使用wiremock来模拟某些请求及其相应的响应,但我试图添加一个正则表达式。不幸的是,这只会引发一个异常,表明请求不匹配。 我也试过了 我发送的请求是