помочь с регулярным выражением - требуется подстрока AM / PM в конце - PullRequest
0 голосов
/ 12 февраля 2010

Я использую preg_match в php для получения именованных подгрупп из строки. Я анализирую сгенерированные пользователем строки даты / времени в хорошо отформатированные токены даты / времени.

Вот мое регулярное выражение

~(?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, чего я бы не хотел. Что я делаю не так?

1 Ответ

3 голосов
/ 12 февраля 2010

Вы используете класс символов [\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
...