更好的正则表达式来验证日期时间

时间:2010-01-15 19:01:57

标签: regex

我有这个正则表达式(\d{4})-(\d{2})-(\d{2})来检测有效日期,但是,它并不完美,因为一些传入数据是2009-24-09(YYYY-DD-MM),有些是2009-09- 24(YYYY-MM-DD)。

是否可以使用单行正则表达式来检测第二个&第三部分大于12,以更好地验证日期?

4 个答案:

答案 0 :(得分:7)

如果你不知道格式,你会得到不明确的结果。

{p> 1 {1>}是1月4日还是3月1日?

您无法使用正则表达式进行验证。

正如Albert所说,尝试解析日期,并确保用户知道要使用的格式。您可能会尝试将月份和年份分成不同的字段或组合框。

答案 1 :(得分:2)

正则表达式对日期验证不是很好,我认为最好尝试解析日期,并且可以在解析之前将正则表达式作为完整性检查。

但是如果您仍然需要它,您可以使用以下正则表达式(\d{4})-(\d{2})-((1[012])|(0\d)|\d)修复月份部分,但在此之后它会走下坡路,因为您需要检查月份和闰年的正确日期。

答案 2 :(得分:0)

验证YYYY-MM-DD或YYYY-DD-MM:

$ptn = '/(\d{4})-(?:(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-2])|(0[1-9]|' .
  '[1-2][0-9]|3[0-2])-(0[1-9]|1[0-2]))/';
echo preg_match_all($ptn, '2009-24-09  2009-09-24 dd', $m);  // returns 2

即便如此,日期可能无效,例如:2010-02-29,以处理checkdate()

checkdate(2, 29, 2010);  // returns false

答案 3 :(得分:0)

(\d{4})-((0[1-9]|1[0-2])-(\d{2}))|((\d{2})-(0[1-9]|1[0-2]))

YYYY-(MM-DD)|(DD-MM)