Лучше регулярное выражение для проверки даты и времени - PullRequest
1 голос
/ 15 января 2010

У меня есть это регулярное выражение (\d{4})-(\d{2})-(\d{2}) для определения действительной даты, однако оно не является идеальным, поскольку некоторые входящие данные - 2009-24-09 (ГГГГ-ДД-ММ), а некоторые - 2009-09-24 ( YYYY-MM-DD).

Можно ли использовать регулярное выражение в одну строку, чтобы определить, больше ли вторая и третья части больше 12, чтобы лучше проверить дату?

Ответы [ 4 ]

7 голосов
/ 15 января 2010

Если вы не знаете формат, вы получите неоднозначные результаты.

взять 2010-01-04 это 4 января или 1 марта?

Вы не можете проверить это с помощью регулярного выражения.

Как сказал Альберт, попробуйте разобрать дату и убедитесь, что пользователи знают, какой формат использовать. Вы можете попытаться разделить части месяца и года на разные поля или списки.

2 голосов
/ 15 января 2010

Регулярные выражения не очень хорошо справляются с проверкой дат, по моему мнению, лучше попытаться проанализировать дату, и вы можете оставить регулярное выражение в качестве проверки работоспособности перед его синтаксическим анализом.

Но если вам все еще это нужно, вы можете исправить раздел месяца, используя следующее регулярное выражение (\d{4})-(\d{2})-((1[012])|(0\d)|\d), но после этого оно идет вниз, так как вам нужно проверять правильные дни в месяцах и високосных годах.

0 голосов
/ 15 января 2010
(\d{4})-((0[1-9]|1[0-2])-(\d{2}))|((\d{2})-(0[1-9]|1[0-2]))

YYYY-(MM-DD)|(DD-MM)

0 голосов
/ 15 января 2010

для проверки ГГГГ-ММ-ДД или ГГГГ-ДД-ММ:

$ptn = '/(\d{4})-(?:(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-2])|(0[1-9]|' .
  '[1-2][0-9]|3[0-2])-(0[1-9]|1[0-2]))/';
echo preg_match_all($ptn, '2009-24-09  2009-09-24 dd', $m);  // returns 2

даже в этом случае, дата может быть недействительной, например: 2010-02-29, чтобы иметь дело с checkdate():

checkdate(2, 29, 2010);  // returns false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...