Я заметил, что представленный ОП ответ не был пуленепробиваемым, поэтому я начал исследовать некоторые функции, упомянутые в комментариях под вопросом, и некоторые из моих собственных мыслей.
Я согласен с apokryfos в том, что использование регулярных выражений для проверки выражения даты не является лучшей практикой. Чистое регулярное выражение будет все более многословным и менее понятным шаблоном, потому что ему придется учитывать високосные годы как в прошлом, так и в будущем. По этой причине я исследовал несколько функций даты, которые предлагает php.
- date_parse_from_format(), предложенный Алексом Ховански. К сожалению, в данном случае это не будет самостоятельным решением, поскольку параметр
format
подчиняется синтаксису/правилам DateTime::createFromFormat():
Посмотрите, как d
и j
сгруппированы вместе, как и m
и n
. Следовательно, эта функция будет обнаруживать недопустимые даты, но не нежелательные ведущие нули.
strptime(), предложенный Casimir et Hippolyte. Эта функция позволяет сопоставлять дни без начальных нулей, используя %e
. Эта функция не имеет символа, который соответствует номерам месяцев, отличным от нуля. Кроме того, могут быть сбои с этой функцией в операционной системе.
check_date() кажется логичным выбором, но опять же, он не дрогнет нулевые числа. Кроме того, эта функция требует немного большей подготовки данных, чем другие, потому что она требует индивидуальной настройки значений месяца, дня и года.
if(!DateTime::createFromFormat('j/n/Y', $date))
, предложенный deceze относительно немного другого сценария, в этом случае не сработает. createFromFormat() сделает все возможное, чтобы создать правильную дату — даже такая строка, как 99/99/9999
, пройдет.
В попытке создать наиболее лаконичное выражение, вот что я могу предложить в качестве кажущегося пуленепробиваемым решения с использованием класса DateTime:
if (($d=DateTime::createFromFormat('n/j/Y',$date)) && $date==$d->format('n/j/Y')){
// valid
}else{
// invalid
}
strtotime()
можно использовать с одним условием для этого случая, потому что формат даты OP использует косую черту в качестве разделителя, и эта функция будет правильно анализировать выражение даты «в американском стиле».
Кажется, это самый простой способ проверить правильность даты без ведущих нулей: Демо-ссылка
if(date('n/j/Y',strtotime($date))==$date){
// valid
}else{
// invalid
}
Если вы имеете дело с выражениями даты и времени и не хотите проверять часть времени, вы можете вызвать эту строку перед условной строкой:
$date = explode(' ', $date)[0]; // create an array of two elements: date and time, then only access date
Ссылка на демонстрацию
or
$date = strstr($date, ' ', true); // extract substring prior to first space
person
mickmackusa
schedule
31.07.2017
date_parse_from_format()
. - person Alex Howansky   schedule 14.06.2017strptime()
. - person Casimir et Hippolyte   schedule 14.06.2017