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

Я нашел регулярное выражение для 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?

Ответы [ 9 ]

44 голосов
/ 26 марта 2010

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

$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'];    
5 голосов
/ 26 марта 2010

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

$date_regex = '~(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d~';
5 голосов
/ 26 марта 2010

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

3 голосов
/ 28 ноября 2017

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

  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$"

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

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

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

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

3 голосов
/ 26 марта 2010

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

$str="03/22/2010";
list($mth,$day,$yr)=explode("/",$str);
var_dump(checkdate($mth,$day,$yr));
1 голос
/ 16 февраля 2014

Проверяет действительные даты от 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])$
1 голос
/ 23 апреля 2010

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

$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 февраля.

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

0 голосов
/ 12 марта 2018

String timeStamp = "03/11/2018 17:51:45";

частный статический шаблон TIMESTAMP_PATTERN = Pattern.compile ("(0? [1-9] | 1 [012]) / (0? [1-9] | [1-2] [0-9] | 3 [ 0-1]) /» + "([1-9] [0-9] {3}) ([0-1]? [0-9] | 2 [0-3]): ([0-5]? [0-9] ): ([0-5] [0-9]) ");

private static boolean isTimeStampValid(String timeStamp) {
        boolean isFeb = timeStamp.split("/")[0].matches("(0?[2])");
        if (isFeb) {
            boolean isValidFebDate = timeStamp.split("/")[1].matches("(0?[1-9]|1[1-9]|2[0-8])");
            if (!isValidFebDate) return false;
        }
        return TIMESTAMP_PATTERN.matcher(timeStamp).matches();
    }
0 голосов
/ 26 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...