zoukankan      html  css  js  c++  java
  • 日期正则匹配 PHP超级强悍

    最简单的正则 如 : d{4}-d{2}-d{2}
    但是实际情况却不是那么简单,,要考虑,有效性和闰年等问题.....

    对于日期的有效范围,不同的应用场景会有所不同。MSDN中定义的DateTime对象的有效范围是:0001-01-01 00:00:00到9999-12-31 23:59:59。

    UNIX时间戳的0按照ISO 8601规范为 :1970-01-01T00:00:00Z。

    先考虑与年份无关的前三条规则,年份可统一写作

    (?!0000)[0-9]{4}

    下面仅考虑月和日的正则

    1. 包括平年在内的所有年份的月份都包含1-28日

    (0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])

    2. 包括平年在内的所有年份除2月外都包含29和30日

    (0[13-9]|1[0-2])-(29|30)

    3. 包括平年在内的所有年份1、3、5、7、8、10、12月都包含31日

    (0[13578]|1[02])-31)

    合起来就是除闰年的2月29日外的其它所有日期

    (?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)

    接下来考虑闰年的实现

    1 : 四年一闰
    ([0-9]{2}(0[48]|[2468][048]|[13579][26])

    2 : 百年不闰,四百年再闰
    (0[48]|[2468][048]|[13579][26])00

    3 : 合起来就是所有闰年的2月29日
    ([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)

    四条规则都已实现,且互相间没有影响,合起来就是所有符合DateTime范围的日期的正则

    ^((?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)|([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)$

    考虑到这个正则表达式仅仅是用作验证,所以捕获组没有意义,只会占用资源,影响匹配效率,所以可以使用非捕获组来进行优化。

    ^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$
  • 相关阅读:
    安全测试 + 渗透测试 Xmind 要点梳理
    Confluence wiki——CentOS6.8搭建详解
    Flask从入门到做出一个博客的大型教程(一)
    基于Cat的分布式调用追踪
    Elastic-job使用及原理
    Jmeter模拟不同带宽
    Mybatis中parameterType、resultMap、statementType等等配置详解(标签中基本配置详解)
    SQLyog Enterprise常用快捷键
    MyBatis 与 Spring Data JPA 选择谁?
    Springboot集成mybatis(mysql),mail,mongodb,cassandra,scheduler,redis,kafka,shiro,websocket
  • 原文地址:https://www.cnblogs.com/dashafa/p/3989096.html
Copyright © 2011-2022 走看看