Использовать filter_var () для проверки даты?

Я, очевидно, не использую filter_var () правильно. Мне нужно проверить, что пользователь ввел действительную дату в форме «dd / mm / yyyy».

Это просто возвращает все, что я передал в качестве даты, в то время как я ожидал, что он вернет либо дату, либо 0 / null / FALSE, если строка ввода не похожа на дату:

$myregex = "/\d{2}\/\d{2}\/\d{4}/"; print filter_var("bad 01/02/2012 bad",FILTER_VALIDATE_REGEXP,array("options"=>array("regexp"=> $myregex))); 

Если кто-то другой использует эту функцию для проверки дат, что я делаю неправильно? Должен ли я использовать другую функцию для проверки полей формы?

Спасибо.

 $myregex = '~^\d{2}/\d{2}/\d{4}$~'; 

Регулярное выражение соответствует, потому что вам просто нужен этот шаблон в любом месте строки. То, что вы хотите, – это только эта картина и ничего больше. Поэтому добавьте ^ и $ .

Обратите внимание, что это все еще не означает, что значение является допустимой датой . 99/99/9999 пройдет этот тест. Я бы использовал:

 if (!DateTime::createFromFormat('d/m/Y', $string)) 

Использование регулярного выражения для проверки даты – плохая идея. Представьте, что 99/99/9999 можно легко увидеть как действительную дату .. вы должны проверить

 bool checkdate ( int $month , int $day , int $year ) 

Простое использование

 $date = "01/02/0000"; $date = date_parse($date); // or date_parse_from_format("d/m/Y", $date); if (checkdate($date['month'], $date['day'], $date['year'])) { // Valid Date } 

Простым и удобным способом проверки даты в PHP является функция strtotime . Вы можете подтвердить дату только одной строкой:

 strtotime("bad 01/02/2012 bad"); //false strtotime("01/02/2012"); //1325455200 unix timestamp 

Зачем использовать тяжелый RegEx, хотя есть родной PHP-класс DateTime ?

 $value = 'badbadbad'; try { $datetime = new \DateTime($value); $value = $datetime->format('Ym-d'); } catch(\Exception $e) { // Invalid date } 

Всегда возвращает формат, который вы ожидали, если была вставлена ​​действительная строка даты.

Попробуйте настроить начало и конец своего регулярного выражения следующим образом:

 $myregex = "/^\d{2}\/\d{2}\/\d{4}$/"; 

Вы получили много ответов, которые указали, что RegEx предоставит ответ 99/99/9999. Это можно решить, добавив немного больше в RegEx. Если вы знаете, что у вас никогда не будет даты за пределами 1900-2099 годов … вы можете использовать RegEx следующим образом:

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

Это подтвердит дату этого формата: dd / mm / YYYY

Между: 01.01.1900 – 31/12/2099

Если вам нужно больше лет, просто добавьте их ближе к концу. | 21 | 22 | 23 | 24 | 25 (продлит его до 2599 года).