Я использую 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
для правильной проверки даты?
вы можете сделать это с помощью 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])$/]');