-1

我想要一个正则表达式来preg_match检查日期是否在模式中DD/MM/YYYY。我尝试了下面的代码,但没有奏效:

preg_match("#^[1-31]*1[1-12]*1[1950-2013]?#", $date);
4

3 回答 3

4

您的正则表达式转换为:

  • 从字符串的开头,
  • 查找 1 到 3 范围内的任意数量的字符,或字符 1
  • 寻找文字 1
  • 查找 1 到 1 范围内的任意数量的字符,或字符 2
  • 寻找文字 1
  • 查找字符 1、9、5、0 到 2、0、1 或 3 中的一个或零

这很明显没有意义。

您无法在正则表达式中验证日期,因为日期不规则。每个月的天数、闰年和许多其他的东西你都有不同的天数。你最好将你的日期分成几部分(使用explode)并检查它checkdate()

于 2012-09-03T22:02:24.953 回答
1

你的正则表达式太错误了,我什至不知道从哪里开始解释。

但最简单的答案是:不要为此使用正则表达式。PHP 已经有非常好的日期处理例程。例如,DateTime::createFromFormat()...

$date = DateTime::createFromFormat('Y/m/d', $dateString);
echo $date->format('j-M-Y');  //outputs something like '15-Feb-2009'

http://www.php.net/manual/en/datetime.createfromformat.php

于 2012-09-03T22:02:39.957 回答
1

您可以使用preg_match("/^\d{1,2}\/\d{1,2}\/\d{4}/",$date);正则表达式,但它不适合此任务,因为您仍然需要执行额外的验证(例如,“9999”是有效的年份)。我认为您可能想看一下date_parse_from_format(),例如:

date_parse_from_format('d/M/Y', $date);

有关更多信息,请参阅在 PHP 中将字符串转换为日期。

于 2012-09-03T22:04:45.373 回答