php日期表达式化源码_php代码格式化源码

hacker|
124

文章目录:

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)$

PHP如何运用正则表达式更改日期

先正则找到日期字符串(中文的日期不行),然后用strtotime得到时间戳,利用改时间戳再次调用strtotime即可。

sample:

$str

=

"date:2012/01/01";

$reg

=

"/:(?date.*$)/";

preg_match($reg,

$str,

$match);

$time

=

date("Y-m-d",strtotime('yesterday',

strtotime($match['date'])));

var_dump($time);

php应用:获取日期正则表达式:\\d{4}[年|\-|\.]\d{\1-\12}[月|\-|\.]\d{\1-\31}日?

^\d{4}(年|\-|\.)(0?[1-9]|1[0-2])(月|\-|\.)(0?[1-9]|[1-2]\d|3[0-1])日?$

这种是还是有缺陷的你可以看到最后一个,还有就是2月31日这样的也会被匹配的。不过应对一般日期还是可以的。

2条大神的评论

  • avatar
    访客 2022-07-11 上午 10:12:24

    率,所以可以使用非捕获组来进行优化。^(?:(?!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]

  • avatar
    访客 2022-07-11 上午 05:46:11

    一写作(?!0000)[0-9]{4}下面仅考虑月和日的正则1. 包括平年在内的所有年份的月份都包含1-28日(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])2. 包括平年在内的所有年份除

发表评论