Каково 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?

22
задан zeckdude 26 March 2010 в 01:31
поделиться

6 ответов

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

$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'];    
45
ответ дан 29 November 2019 в 03:46
поделиться

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

5
ответ дан 29 November 2019 в 03:46
поделиться

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

$date_regex = '~(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d~';
5
ответ дан 29 November 2019 в 03:46
поделиться

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

$str="03/22/2010";
list($mth,$day,$yr)=explode("/",$str);
var_dump(checkdate($mth,$day,$yr));
3
ответ дан 29 November 2019 в 03:46
поделиться

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

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

0
ответ дан 29 November 2019 в 03:46
поделиться

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

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

1
ответ дан 29 November 2019 в 03:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: