0

我正在使用 php 的 preg_match 从字符串中获取命名的子组。我正在将用户生成的日期/时间字符串解析为格式正确的日期/时间标记。

这是我的正则表达式

~(?P<month>\d?\d)(/|-)(?P<day>\d?\d)(/|-)(?P<year>\d\d\d?\d?) +(?P<time>[\d: +((A|a)|(P|p))(M|m)]+)~i

它可以正确解析日期,例如

01-17-10 09:30 pm
2/1/2010 06:19am

进入它们的组成部分。但是,它接受02/11/2010 06:19,没有 am/pm 字符串,我不希望它这样做。我究竟做错了什么?

4

1 回答 1

3

您正在使用字符类[\d: +((A|a)|(P|p))(M|m)]来表达时间。此字符集仅描述一个字符,而不是具有已定义模式的序列。

请尝试(?P<time>\d\d?:\d\d *[ap]m)

~(?P<month>\d\d?)(/|-)(?P<day>\d\d?)(/|-)(?P<year>\d\d\d?\d?) +(?P<time>\d\d?:\d\d *[ap]m)~i
于 2010-02-12T17:25:42.840 回答