Intereting Posts
Как исправить тайм-аут соединения cURL SSL, который происходит только при первом вызове сценария Как я могу прочитать файл .tar.gz с PHP? простая html dom возвращающая строка вместо массива Показывать количество пользователей в реальном времени на веб-сайте с помощью Google Analytics Выбросить одиночные кавычки в строке, содержащей одиночные и двойные кавычки cURL – загрузить сайт с защитой CloudFlare Преобразование пикселей в точки для pdf Документация Magento ORM Как я могу разобрать JSON в html-таблицу с помощью PHP? Развертывание области в конструкторах PHP-класса PHP / MYSQL допускает только один голос на одного члена? Неустранимая ошибка: вызов неопределенной функции mb_strlen () Неправильная ориентация Jcrop от загрузки Iphone, как я могу это сделать? codeigniter: почему это происходит, когда i echo base_url () в атрибуте href тега привязки, он повторяет два раза PHP MySQLI Запретить SQL Injection

Проверка даты php

Я пытаюсь настроить проверку даты php (MM / DD / YYYY), но у меня возникают проблемы. Вот пример того, что я получил:

$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,$_POST['birthday']) ==true) { $errors[] = 'user name most have no spaces';` 

Вы можете использовать checkdate . Например, что-то вроде этого:

 $test_date = '03/22/2010'; $test_arr = explode('/', $test_date); if (checkdate($test_arr[0], $test_arr[1], $test_arr[2])) { // valid date ... } 

Более параноидальный подход, который не слепо верит в ввод:

 $test_date = '03/22/2010'; $test_arr = explode('/', $test_date); if (count($test_arr) == 3) { if (checkdate($test_arr[0], $test_arr[1], $test_arr[2])) { // valid date ... } else { // problem with dates ... } } else { // problem with input ... } 

Вы можете использовать некоторые методы класса DateTime , что может быть удобно; а именно DateTime::createFromFormat() в сочетании с DateTime::getLastErrors() .

 $test_date = '03/22/2010'; $date = DateTime::createFromFormat('m/d/Y', $test_date); $date_errors = DateTime::getLastErrors(); if ($date_errors['warning_count'] + $date_errors['error_count'] > 0) { $errors[] = 'Some useful error message goes here.'; } 

Это даже позволяет нам увидеть, что на самом деле вызвало предупреждения или ошибки синтаксического анализа даты (посмотрите на массивы warnings и errors в $date_errors ).

Хотя checkdate хорошо, это кажется очень сжатой функцией для проверки, а также вы можете предоставить форматы. [ Источник ]

 function validateDate($date, $format = 'Ymd H:i:s') { $d = DateTime::createFromFormat($format, $date); return $d && $d->format($format) == $date; } 

функция была скопирована из этого ответа или php.net

Экстра ->format() необходим для случаев, когда дата недействительна, но createFromFormat прежнему удается создать объект DateTime. Например:

 // Gives "2016-11-10 ..." because Thursday falls on Nov 10 DateTime::createFromFormat('DM j Y', 'Thu Nov 9 2016'); // false, Nov 9 is a Wednesday validateDate('Thu Nov 9 2016', 'DM j Y'); 

Вместо громоздкого объекта DateTime просто используйте функцию date date ()

 function isValidDate($date, $format= 'Ym-d'){ return $date == date($format, strtotime($date)); } 

REGEX должен быть последним средством. PHP имеет несколько функций, которые будут проверяться для вас. В вашем случае, checkdate – лучший вариант. http://php.net/manual/en/function.checkdate.php

Решение Nicolas лучше всего. Если вы хотите в регулярном выражении,

попробуй это,

это будет подтверждено, 01/01/1900 по 12/31/2099 Соответствует недействительным датам, таким как 31 февраля. Принимает тире, пробелы, косые черты и точки в качестве разделителей даты

 (0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)[0-9]{2} 

Используй это:

 function validate_Date($mydate,$format = 'DD-MM-YYYY') { if ($format == 'YYYY-MM-DD') list($year, $month, $day) = explode('-', $mydate); if ($format == 'YYYY/MM/DD') list($year, $month, $day) = explode('/', $mydate); if ($format == 'YYYY.MM.DD') list($year, $month, $day) = explode('.', $mydate); if ($format == 'DD-MM-YYYY') list($day, $month, $year) = explode('-', $mydate); if ($format == 'DD/MM/YYYY') list($day, $month, $year) = explode('/', $mydate); if ($format == 'DD.MM.YYYY') list($day, $month, $year) = explode('.', $mydate); if ($format == 'MM-DD-YYYY') list($month, $day, $year) = explode('-', $mydate); if ($format == 'MM/DD/YYYY') list($month, $day, $year) = explode('/', $mydate); if ($format == 'MM.DD.YYYY') list($month, $day, $year) = explode('.', $mydate); if (is_numeric($year) && is_numeric($month) && is_numeric($day)) return checkdate($month,$day,$year); return false; } 

Я знаю, что это более старая должность, но я разработал следующую функцию для проверки даты:

 function IsDateTime($aDateTime) { try { $fTime = new DateTime($aDateTime); $fTime->format('m/d/YH:i:s'); return true; } catch (Exception $e) { return false; } } 

Не уверен, ответит ли этот вопрос на вопрос или собирается помочь ….

 $dt = '6/26/1970' ; // or // '6.26.1970' ; $dt = preg_replace("([.]+)", "/", $dt); $test_arr = explode('/', $dt); if (checkdate($test_arr[0], $test_arr[1], $test_arr[2]) && preg_match("/[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}/", $dt)) { echo(date('Ym-d', strtotime("$dt")) . "<br>"); } else { echo "no good...format must be in mm/dd/yyyy"; } 

Мы можем использовать простой тип ввода «дата», как показано ниже:

 Birth date: <input type="date" name="userBirthDate" /><br /> 

Затем мы можем связать интерфейс DateTime со встроенной функцией «explode»:

 public function validateDate() { $validateFlag = true; $convertBirthDate = DateTime::createFromFormat('Ym-d', $this->birthDate); $birthDateErrors = DateTime::getLastErrors(); if ($birthDateErrors['warning_count'] + $birthDateErrors['error_count'] > 0) { $_SESSION['wrongDateFormat'] = "The date format is wrong."; } else { $testBirthDate = explode('-', $this->birthDate); if ($testBirthDate[0] < 1900) { $validateFlag = false; $_SESSION['wrongDateYear'] = "We suspect that you did not born before XX century."; } } return $validateFlag; } 

Я тестировал его в Google Chrome и IE, все работает правильно. Furthemore, Chrome отображает простой дополнительный интерфейс. Если вы ничего не пишете на входе или не записываете в плохом формате (правильно следующее: «1919-12-23»), вы получите первое утверждение. Если вы пишете все в хорошем формате, но вы вводите неверную дату (я предполагал, что никто не может родиться до XX века), ваш контроллер отправит второе заявление.

Попробуй это

 /^(19[0-9]{2}|2[0-9]{3})\-(0[1-9]|1[0-2])\-(0[1-9]|1[0-9]|2[0-9]|3[0-1])((T|\s)(0[0-9]{1}|1[0-9]{1}|2[0-3]{1})\:(0[0-9]{1}|1[0-9]{1}|2[0-9]{1}|3[0-9]{1}|4[0-9]{1}|5[0-9]{1})\:(0[0-9]{1}|1[0-9]{1}|2[0-9]{1}|3[0-9]{1}|4[0-9]{1}|5[0-9]{1})((\+|\.)[\d+]{4,8})?)?$/ 

это регулярное выражение, справедливое для:

  • 2017-01-01T00: 00: 00 + 0000
  • 2017-01-01 00: 00: 00 + 00: 00
  • 2017-01-01T00: 00: 00 + 00: 00
  • 2017-01-01 00: 00: 00 + 0000
  • 2017-01-01

Помните, что это будет охватывать весь случай даты и даты с символом ( )