Я, очевидно, не использую 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 года).