php的时间正则表达式
求英雄赐一个验证如下格式的时间正则表达式11-0623:08不需要年和秒,高手们写的那些不知道修改...
求英雄赐一个验证如下格式的时间正则表达式
11-06 23:08 不需要年和秒,高手们写的那些不知道修改 展开
11-06 23:08 不需要年和秒,高手们写的那些不知道修改 展开
5个回答
展开全部
最简单的正则 如 : \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)$
但是实际情况却不是那么简单,,要考虑,有效性和闰年等问题.....
对于日期的有效范围,不同的应用场景会有所不同。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)$
展开全部
echo preg_match('/^\d{2}\-\d{2}\s+\d{2}:\d{2}$/i', '11-06 23:08') ? 'ok' : 'no';
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1 年部分([12]\d\d\d)
第一位只能是1或者2. 四位年份表达。
2 月部分(0[1-9]|1[0-2])
第一位为0时,第二位可以是1-9,即一月到九月。
第一位为1时,第二位可以是0-2,即十月到十二月。
3 日部分(3[01]|[12]\d|0[1-9])
十位为3时,个位只能是0或1.
十位为1或2时,个位无限制。
十位为0时,个位不能为0.
4 时和分部分([0-5]\d)
0~59。
综上
([12]\d\d\d)-(0[1-9]|1[0-2])-(3[01]|[12]\d|0[1-9]) ([0-5]\d):([0-5]\d)
中间分隔符根据需要而改变。
第一位只能是1或者2. 四位年份表达。
2 月部分(0[1-9]|1[0-2])
第一位为0时,第二位可以是1-9,即一月到九月。
第一位为1时,第二位可以是0-2,即十月到十二月。
3 日部分(3[01]|[12]\d|0[1-9])
十位为3时,个位只能是0或1.
十位为1或2时,个位无限制。
十位为0时,个位不能为0.
4 时和分部分([0-5]\d)
0~59。
综上
([12]\d\d\d)-(0[1-9]|1[0-2])-(3[01]|[12]\d|0[1-9]) ([0-5]\d):([0-5]\d)
中间分隔符根据需要而改变。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
月部分(0[1-9]|1[0-2])
日部分(3[01]|[12]\d|0[1-9])
时和分部分([0-5]\d)
全部
(0[1-9]|1[0-2])-(3[01]|[12]\d|0[1-9]) ([0-5]\d):([0-5]\d)
日部分(3[01]|[12]\d|0[1-9])
时和分部分([0-5]\d)
全部
(0[1-9]|1[0-2])-(3[01]|[12]\d|0[1-9]) ([0-5]\d):([0-5]\d)
更多追问追答
追问
这个只能验证格式是不是正确,无法验证合法性吧?
比如 13-55 99:14这样是不是能通过啊?
我不知道怎么写进代码里面
追答
这个可以验证合法性的月部分限制为01-12,日部分限制为01-31,时和分部分限制为00-59
$shijian = $_POST['shijian'];
$preg = '/^(0[1-9]|1[0-2])-(3[01]|[12]\d|0[1-9]) ([0-5]\d):([0-5]\d)$/';
if(preg_match($preg, $shijian))
{
如果说还存在什么问题的话,那就是日期的合法性了
也就是11-31 00:00也能通过,但这个日期是非法的
可以通过使用checkdate再验证一下日期的合法性
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
date("m-d H:i",$time)不要正则了吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询