什么是 MM/DD/YYYY 正则表达式,如何在 php 中使用它?

2022-08-30 16:21:39

我在 http://www.regular-expressions.info/regexbuddy/datemmddyyyy.html 找到了MM / DD / YYYY的正则表达式,但我认为我没有正确使用它。

这是我的代码:

$date_regex = '(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d';

$test_date = '03/22/2010';
if(preg_match($date_regex, $test_date)) {
  echo 'this date is formatted correctly';  
} else {
  echo 'this date is not formatted correctly';  
}

当我运行这个时,它仍然回声“此日期格式不正确”,而它应该说相反。如何在php中设置此正则表达式?


答案 1

问题是定界符和转义字符(正如其他人所提到的)。这将工作:

$date_regex = '/(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d/';

$test_date = '03/22/2010';
if(preg_match($date_regex, $test_date)) {
  echo 'this date is formatted correctly';
} else {
  echo 'this date is not formatted correctly';
}

请注意,我在表达式的开头和结尾添加了一个正斜杠,并对模式中的正斜杠进行了转义(使用反斜杠)。

更进一步,这种模式将无法正确提取年份...只是一个世纪。您需要将其更改为(如Jan在下面指出的那样),如果要确保整个字符串匹配(而不是某些子集),则需要使用更类似的东西。/(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]((?:19|20)\d\d)//^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]((?:19|20)\d\d)$/


正如其他人所提到的,strtotime()可能是一个更好的选择,如果你只是想把日期拿出来。它可以解析几乎任何常用的格式,它会给你一个unix时间戳。你可以这样使用它:

$test_date = '03/22/2010';

// get the unix timestamp for the date
$timestamp = strtorime($test_date);

// now you can get the date fields back out with one of the normal date/time functions. example:
$date_array = getdate($timestamp);
echo 'the month is: ' . $date_array['month'];    

答案 2

问题作者的正则表达式几乎是正确的。未验证日期,因为模式应为:

  pattern="^(0[1-9]|1[012])[/](0[1-9]|[12][0-9]|3[01])[/](19|20)\d\d$"

或者如果花哨:

  pattern="^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d$"

请注意,此模式仅检查日期的格式和单个日期元素的最大/最小值。这意味着应该在JavaScript函数和/或服务器中检查用户的条目日期的有效性(例如,如果一年不是闰年,则不允许2月29日)。

顺便说一句,如果您想允许一个数字(假设为一个月),请将月份部分更改为

([0-9]|0[1-9]|1[012])

说明:
[0-9] - 0 和 9
之间的单个数字或
0[1-9] - 01 和 09
之间的两位数字或
1[012] - 两位数字限制为 10、11、12


推荐