更正正则表达式以匹配日期

时间:2009-10-28 12:26:37

标签: php regex

用于验证日期的正确正则表达式是什么。 2009-10-22或2009-01-01等平台PHP

11 个答案:

答案 0 :(得分:7)

This(来自regexplib.com)将匹配您想要的内容,并执行闰年,每月每天等的检查。它对分隔符的容忍度比您想要的要强一些,但可以很容易修复。正如你所看到的,它相当可怕。

或者(最好在我看来)你可能只想检查正确位置的数字,然后在代码中执行闰年和每月日检查。有时一个正则表达式不是那么容易理解,并且明确地在代码中执行检查更清晰(因为您可以准确地报告错误 - “11月仅30天”,而不是“不匹配模式”消息,这是旁边无用)

答案 1 :(得分:3)

如果你想要一些简单的东西,而不仅仅是验证格式,但是没有尽可能多地验证输入月份或闰年的天数,你可以使用:

^(19|20)[0-9]{2}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$

此示例允许年份19xx和20xx

答案 2 :(得分:1)

因为你必须处理接受2009-02-28而不是2009-02-29,但接受2008-02-28你需要更多的逻辑,1认为正则表达式可以给。 (但如果有人能表现出来,我会留下深刻的印象)

我会尝试将其转换为日期并报告转换是否失败,或者您的语言是否有检查日期函数使用它。

答案 3 :(得分:1)

\d{4}-\d{2}-\d{2}将匹配该表单中的字符串,但要检查日期是否有效,您必须将该字符串分解为年,月和日期(您可以使用此正则表达式)部分并检查每个他们。

您还可以确保年份必须以1或2开头:[12]\d{3}-\d{2}-\d{2},您也可以按月和日期执行相同操作:[12]\d{3}-[01]\d-[0123]\d(但我会使用第一个正则表达式并“手动”比较部分

答案 4 :(得分:1)

发现这个在网上测试了几个日期,看起来很稳定,日期在1900到2000之间:

(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])

答案 5 :(得分:1)

好的,可以验证月和日范围的正则表达式

[0-9]{4}-(?:1[0-2]|[1-9])-(?:3[01]|[12][0-9]|[1-9])

如果您想限制年份,比如说,从1900年到2050年,您最终可以

(?:2050|20[0-4][0-9]|19[0-9]{2})-(?:1[0-2]|[1-9])-(?:3[01]|[12][0-9]|[1-9])

他们不会像2月31日那样捕捉到“微妙错误”的日期,所以很明显需要在正则表达式之外执行完整性检查。

答案 6 :(得分:0)

在.NET Regex中:

\d{4}\-\d{2}\-\d{2}

答案 7 :(得分:0)

[0-9]{4}-[0-9]{2}-[0-9]{2}

\d\d\d\d-\d\d-\d\d

...

只需阅读第一个正则表达式教程

答案 8 :(得分:0)

 ^\d{4}-\d{2}-\d{2}$

但没有正则表达式可以阻止某人输入“9867-39-56”

答案 9 :(得分:0)

对于完整的验证(包括验证日,月和年份部分是否有效),正则表达式不是首选工具。除了月份问题,你会遇到闰年的麻烦......

因此,如果您只想检查粗略格式是否正确,或者隔离不同的部分(年 - 月 - 日),那么正则表达式就可以了。

([0-9]{1,4})-(1[012]|0?[1-9])-([12][0-9]|3[01]|0?[1-9])

这已经非常精确,并将年份(0..9999),月份和日期捕获到捕获组中,准备好进行解析......

答案 10 :(得分:0)

如果您可以依赖的不仅仅是正则表达式,那么使用PHP提供的Posix函数date()和time()的混合解决方案可能如下所示:

<?php
date_default_timezone_set("GMT");

function validateDate($date)
{
    if (preg_match("^[0-9]{4}-[0-9]{2}-[0-9]{2}^", $date))
    {
        return date('Y-m-d', strtotime($date)) === $date;
    }
    return false;
}

// Some tests
$dates = array(
    '2009-09-09', '2009-09-32', '2009-31-00', '2035-01-02',
);
foreach($dates AS $date)
{
    echo $date .': '. (validateDate($date) ? 'OK' : 'FAILS') ."\n";
}
?>

它不优雅加上你将受到Unix纪元时间的限制(从格林威治标准时间1970年1月1日00:00:00到格林尼治标准时间2038年1月19日03:14:07),但它是可靠的并且在PHP中得到很好的支持。 / p>