Что такое регулярное выражение MM / DD / YYYY и как его использовать в php?

Я нашел регулярное выражение для MM / DD / YYYY по адресу http://www.regular-expressions.info/regexbuddy/datemmddyyyy.html, но я не думаю, что правильно его использую.

Вот мой код:

$date_regex = '(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d'; $test_date = '03/22/2010'; if(preg_match($date_regex, $test_date)) { echo 'this date is formatted correctly'; } else { echo 'this date is not formatted correctly'; } 

Когда я запускаю это, он все еще повторяет «эта дата не отформатирована правильно», когда нужно сказать обратное. Как установить это регулярное выражение в php?

Проблема состоит в том, что один из разделителей и экранированных символов (как указывали другие). Это будет работать:

 $date_regex = '/(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d/'; $test_date = '03/22/2010'; if(preg_match($date_regex, $test_date)) { echo 'this date is formatted correctly'; } else { echo 'this date is not formatted correctly'; } 

Обратите внимание, что я добавил косую черту в начало и конец выражения и привязал (с обратной косой чертой) косые черты в шаблоне.

Чтобы сделать это еще на один шаг, этот шаблон не будет правильно извлекать год … только век. Вам нужно будет изменить его на /(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]((?:19|20)\d\d)/ и (как указывал Ян, ниже), если вы хотите убедиться, что вся строка соответствует (вместо некоторого подмножества), вы захотите пойти с чем-то более похожим на /^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]((?:19|20)\d\d)$/ .


Как отмечали другие, strtotime () может быть лучшим вариантом, если вы просто пытаетесь получить дату. Он может анализировать почти любой широко используемый формат, и он даст вам временную метку unix. Вы можете использовать его следующим образом:

 $test_date = '03/22/2010'; // get the unix timestamp for the date $timestamp = strtorime($test_date); // now you can get the date fields back out with one of the normal date/time functions. example: $date_array = getdate($timestamp); echo 'the month is: ' . $date_array['month']; 

Скорее всего, лучше использовать strtotime (), который преобразует практически любой формат, пригодный для чтения человеком, в временную метку unix. – http://php.net/manual/en/function.strtotime.php

Вам нужны правильные разделители вокруг шаблона.

 $date_regex = '~(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d~'; 

вы также можете использовать функцию checkdate () . Нет необходимости в регулярном выражении.

 $str="03/22/2010"; list($mth,$day,$yr)=explode("/",$str); var_dump(checkdate($mth,$day,$yr)); в $str="03/22/2010"; list($mth,$day,$yr)=explode("/",$str); var_dump(checkdate($mth,$day,$yr)); 

Чтобы использовать это регулярное выражение для проверки дат в PHP-коде, вам необходимо правильно форматировать его как строку с дополнительными разделителями регулярных выражений, как это требуется для функций PHP preg. Вам также необходимо добавить привязки, чтобы заставить регулярное выражение соответствовать всей строке (или не совпадать):

 $date_regex = '%\A(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d\z%'; $test_date = '03/22/2010'; if(preg_match($date_regex, $test_date)) { echo 'this date is formatted correctly'; } else { echo 'this date is not formatted correctly'; } 

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

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

Это проверяет действительные даты с MM/DD/1960 на MM/DD/2014

Также принимает даты, такие как M/D/YYYY и 0M/0D/YYYY

 ^(?:[1-9]|0[1-9]|1[0-2])/(?:[0-9]|0[1-9]|1[0-9]|2[0-9]|3[0-1])/(?:20[6-9][0-9]|20[0-1][0-4])$ 

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

  pattern="^(0[1-9]|1[012])[/](0[1-9]|[12][0-9]|3[01])[/](19|20)\d\d$" 

или если это фантазия:

  pattern="^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d$" 

Обратите внимание, что этот шаблон проверяет только формат даты и максимальных / минимальных значений для отдельных элементов даты. Это означает, что запись пользователя должна проверяться на достоверность даты в функции JavaScript и / или на сервере (например, 29 февраля не допускается, если год не является скачкообразным).

В качестве примечания, если вы хотите разрешить одну цифру (допустим, в течение месяца), измените месячную часть на

 ([0-9]|0[1-9]|1[012]) 

Объяснение:
[0-9] – одиночная цифра между 0 и 9
или
0 [1-9] – две цифры между 01 и 09
или
1 – две цифры, ограниченные 10, 11, 12

Вашему регулярному выражению нужны разделители:

/(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d/