Подтвердить что ты не робот

Что такое регулярное выражение 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?

4b9b3361

Ответ 1

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

$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';
}

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

Чтобы сделать это еще на один шаг, этот шаблон не будет правильно извлекать год... только век. Вам нужно будет изменить его на /(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'];    

Ответ 2

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

Ответ 4

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

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

Ответ 5

Чтобы использовать это регулярное выражение для проверки дат в 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-го февраля.

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

Ответ 6

Это проверяет действительные даты от 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])$

Ответ 7

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

  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 [012] - две цифры, ограниченные 10, 11, 12

Ответ 8

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

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