Codeigniter – формат даты – подтверждение формы

Я использую codeigniter с PHP . Я использую следующую форму,

 <?php echo form_open('/register/create_new', $form_params); ?> DOB: <input type="text" id="dob" name="reg[dob]"> <input type="submit" value="Create Account" /> </form> 

здесь #dob находится в формате dd-mm-yyyy .

мой код проверки,

 array( 'field' => 'reg[dob]', 'label' => 'DOB', 'rules' => 'required' ) 

Как я могу установить rules для правильной проверки даты?

Solutions Collecting From Web of "Codeigniter – формат даты – подтверждение формы"

вы можете сделать это с помощью regex

 $this->form_validation->set_rules('reg[dob]', 'Date of birth', 'regex_match[(0[1-9]|1[0-9]|2[0-9]|3(0|1))-(0[1-9]|1[0-2])-\d{4}]'); 

Вы можете использовать функции обратного вызова CodeIgniters , создав функцию callback_date_valid (), которая проверяет, действительна ли дата.

И чтобы проверить, действительно ли это, вы можете использовать функцию checkdate PHP

 array( 'field' => 'reg[dob]', 'label' => 'DOB', 'rules' => 'required|date_valid' ) function callback_date_valid($date){ $day = (int) substr($date, 0, 2); $month = (int) substr($date, 3, 2); $year = (int) substr($date, 6, 4); return checkdate($month, $day, $year); } 

У меня есть довольно чистое решение для этого. Вы можете расширить библиотеку проверки подлинности формы.

Сделайте это, поставив файл MY_Form_validation.php в папку приложения / библиотеки. Этот файл должен выглядеть так:

 class MY_Form_validation extends CI_Form_validation { public function __construct($rules = array()) { parent::__construct($rules); } public function valid_date($date) { $d = DateTime::createFromFormat('Ym-d', $date); return $d && $d->format('Ym-d') === $date; } } 

Чтобы добавить сообщение об ошибке, перейдите в папку application / language / и откройте файл form_validation_lang.php. Добавьте запись в массив $ lang в конце файла, например:

 $lang['form_validation_valid_date'] = 'The field {field} is not a valid date'; 

Обратите внимание, что ключ здесь должен быть таким же, как имя функции (valid_date).

Затем в вашем контроллере вы используете это как любую другую функцию проверки формы, например, как «требуется»,

 $this->form_validation->set_rules('date','Date','trim|required|valid_date'); 

Я знаю, что это устарело, но я столкнулся с одной и той же проблемой. Мне нравится ответ Winks, но обнаружил, что код не работает. Я изменил это на это:

  public function your_form_handler($date) { // .... $this->form_validation->set_rules('date', 'Date', 'required|callback_date_valid'); // .... } /** * Validate dd/mm/yyyy */ public function date_valid($date) { $parts = explode("/", $date); if (count($parts) == 3) { if (checkdate($parts[1], $parts[0], $parts[2])) { return TRUE; } } $this->form_validation->set_message('date_valid', 'The Date field must be mm/dd/yyyy'); return false; } 

В CodeIDiter form_validation Library нет встроенной проверки даты, но вы можете использовать ее обратный вызов для вызова функции и проверки даты с использованием собственных возможностей PHP.

С помощью DateTime вы можете сделать кратчайший валидатор даты и времени для всех форматов.

 function validateDate($date, $format = 'Ymd H:i:s') { $d = DateTime::createFromFormat($format, $date); return $d && $d->format($format) == $date; } var_dump(validateDate('2012-02-28 12:12:12')); # true var_dump(validateDate('2012-02-30 12:12:12')); # false var_dump(validateDate('2012-02-28', 'Ym-d')); # true var_dump(validateDate('28/02/2012', 'd/m/Y')); # true var_dump(validateDate('30/02/2012', 'd/m/Y')); # false var_dump(validateDate('14:50', 'H:i')); # true var_dump(validateDate('14:77', 'H:i')); # false var_dump(validateDate(14, 'H')); # true var_dump(validateDate('14', 'H')); # true var_dump(validateDate('2012-02-28T12:12:12+02:00', 'Ymd\TH:i:sP')); # true # or var_dump(validateDate('2012-02-28T12:12:12+02:00', DateTime::ATOM)); # true var_dump(validateDate('Tue, 28 Feb 2012 12:12:12 +0200', 'D, d MYH:i:s O')); # true # or var_dump(validateDate('Tue, 28 Feb 2012 12:12:12 +0200', DateTime::RSS)); # true var_dump(validateDate('Tue, 27 Feb 2012 12:12:12 +0200', DateTime::RSS)); # false 

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

Мне нравится ответ tmsimont, но обнаружил, что код не работает, если не числовые значения enterd. Измененный код приведен ниже:

 /** * Validate dd/mm/yyyy */ public function date_valid(){ $date=$this->input->post('dob'); $parts = explode("/", $date); if (count($parts) == 3) { if (is_numeric($parts[2])) { if (is_numeric($parts[0])) { if (is_numeric($parts[1])) { if (checkdate($parts[1], $parts[0], $parts[2])){ return TRUE; } } } } } $this->form_validation->set_message('date_valid', 'The Date field must be mm/dd/yyyy'); return false; } 

Действительное Regex for Codeigniter Дата проверки:

 $this->form_validation->set_rules('reg[dob]','Date of birth',array('regex_match[/^((0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.](19|20)\d\d)$/]')); 

Я использую одно и то же выражение для формата dd-mm-yyyy и dd / mm / yyyy

Нет предупреждений и ошибок 🙂

Использование Regex, вероятно, лучший способ. Я использую это Regex, которое я нашел здесь для формата YYYY-MM-DD: http://www.regular-expressions.info/dates.html

Реальное выражение:

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

Он имеет приятное объяснение того, как работает каждый раздел, чтобы вы могли его модифицировать для разных форматов даты.

Затем вы можете использовать код, предложенный @Abin: (убедитесь, что вы заключили его в какой-то разделитель)

 $this->form_validation->set_rules('reg[dob]', 'Date of birth', 'regex_match[/^(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$/]');