W3CDTF规范用于验证日期的正则表达式

时间:2013-02-21 15:43:18

标签: php regex validation date

我根据W3 specification

检查日期是否有效
/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(:(\d{2}))?(?:([-+])(\d{2}):?(\d{2})|(Z))?/

接受以下格式:

   Year:
      YYYY (eg 1997)
   Year and month:
      YYYY-MM (eg 1997-07)
   Complete date:
      YYYY-MM-DD (eg 1997-07-16)
   Complete date plus hours and minutes:
      YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00)
   Complete date plus hours, minutes and seconds:
      YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)
   Complete date plus hours, minutes, seconds and a decimal fraction of a
second
      YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00)

2005-04-05永远不会匹配,我不能为我的生活弄清楚。根据模式,它应该匹配。

1 个答案:

答案 0 :(得分:2)

考虑使用OR类型方法进行构建,然后根据需要简化后面的内容:

(\d{4})|(\d{4}-\d{2})|(\d{4}-\d{2}-\d{2})|(\d{4}-\d{2}-\d{2}T\d{2}(:\d{2}){1,2}[-+]\d{2}:\d{2})

此外,这不是检查日期的有效数字,如果你模块化它可以很容易地完成它一步一步。日期的示例可能如下所示:

\d{4}-(([0]{0,1}[\d])|(1[0-2]))-(([0-2]{0,1}[\d])|(3[01]))

请注意,这只假设4位数年份,并且任何4位数年份都可以。它还允许01和1作为单个数字月和日数。还有一些额外的包围以保持清晰。