Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP preg_与工作正则表达式匹配_Php_Preg Match - Fatal编程技术网

PHP preg_与工作正则表达式匹配

PHP preg_与工作正则表达式匹配,php,preg-match,Php,Preg Match,这总是返回false。我使用了唯一的工具来构建正则表达式,它在那里工作得很好。当我在正则表达式中添加“/”时,问题开始了。不知何故PHP似乎需要这些,但我不知道为什么,我不知道为什么它打破了我的正则表达式 对于像“2012-08-24 20:30:00”这样的东西,它应该返回TRUE;对于“asdf2012-08-24 20:30:00asdf”或任何与我的正则表达式不符的东西,它应该返回FALSE 提前谢谢 -----------------------编辑 谢谢你的回答 正如一些用户指出的那

这总是返回false。我使用了唯一的工具来构建正则表达式,它在那里工作得很好。当我在正则表达式中添加“/”时,问题开始了。不知何故PHP似乎需要这些,但我不知道为什么,我不知道为什么它打破了我的正则表达式

对于像“2012-08-24 20:30:00”这样的东西,它应该返回TRUE;对于“asdf2012-08-24 20:30:00asdf”或任何与我的正则表达式不符的东西,它应该返回FALSE

提前谢谢

-----------------------编辑 谢谢你的回答

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

-----------------------编辑2

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


谢谢大家

这应该更有效,而且写得更简单:

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;
    }
}
但是,如其他人所述,
9999-99-99 29:59:59
将返回true

从PHP手册中,您可以轻松找到更优雅、更可靠的解决方案,例如(灵感来源于):


为我返回
true
。请尝试使用以下正则表达式:

function validateDate($data)
{
    return (date('Y-m-d H:i:s', strtotime($data)) == $data);
}

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

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

使用PCRE函数时,要求图案用分隔符括起来。分隔符可以是任何非字母数字、非反斜杠、非空白字符

以及:

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

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

您可以将此函数用于所有类型的日期/时间验证。示例:

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

这不是验证日期的方式。它将允许
9999-99-99
。虽然允许高达9999年是很好的预见,但我不认为9NHUN HUTURE是一个真正的月份。考虑使用SttoTimeTo()或DATETIME类而不是TBTW,不需要<代码> /< /代码> -只需要一些匹配的表达式定界符。您可以使用
|
~
,甚至可以使用字母数字字符(如果您愿意),只要您在末尾匹配它(以及表达式体中使用的同一字符的转义实例)。该函数适用于您提供的示例日期。Marc B-也许我希望这些日期得到验证Brian-您能否详细说明我必须如何更改代码以使其工作?很有趣,但没有回答我通过尝试解决主要问题间接回答的问题(该函数始终返回false)。我只是想帮忙;它真的值得投否决票吗?现在你已经编辑了,不。但在是之前,它确实值得投反对票。“此答案无效”是“向下投票”按钮的工具提示。而且也没用。既然你已经编辑好了,我同意上传你的答案。当我手动设置$date='2012-08-24 20:30:00'时,我的函数返回true,这是真的,但当我在代码中的其他地方使用这个精确的字符串调用函数时,它确实返回FALSE,你知道为什么吗?你确定字符串前后没有空格吗?甚至是不可打印的字符?字符串从哪里来?+1。我在回答中使用了这个+1.我在回答时用了这个P
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;
}
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
# ...