日期正则匹配 PHP超级强悍
2014-09-23 19:16
183 查看
最简单的正则 如 : \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)$
相关文章推荐
- PHP正则匹配日期和时间(时间戳转换)的实例代码
- php正则匹配字符串中是否有日期数据
- PHP正则匹配日期和时间(时间戳转换)的实例代码
- 超级无敌正则表达式(匹配日期时间)
- PHP中正则表达式对UNICODE字符码的匹配方法
- PHP,JS汉字正则匹配
- php中utf-8编码下用正则表达式如何匹配汉字
- php中utf-8编码下用正则表达式如何匹配汉字
- php正则邮箱匹配实例
- php 正则表达式提取网页超级链接url的函数
- PHP正则表达式匹配并输出数组(做小偷程序很有用)
- 用PHP正则表达式匹配中文
- 在php中用正则表达式实现最短匹配
- 完善匹配中文的Php正则表达式(转)
- 根据标签中肯定的部分 匹配不肯定的部分 正则 php
- php下正则来匹配dede模板标签的代码
- 一个通用的php正则表达式匹配或检测或提取特定字符类
- php中使用正则表达式匹配的函数
- PHP下ereg实现匹配ip的正则
- php中utf-8编码下用正则表达式如何匹配汉字