Codeigniter - 日期格式 - 表单验证

Kar*_*Sho 12 php codeigniter codeigniter-form-helper

我使用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>
Run Code Online (Sandbox Code Playgroud)

在这里,#dobdd-mm-yyyy格式.

我的验证码是,

array(
  'field' => 'reg[dob]',
  'label' => 'DOB',
  'rules' => 'required'
)
Run Code Online (Sandbox Code Playgroud)

如何设置rules正确的日期验证?

Win*_*nks 19

您可以通过创建callback_date_valid()函数来使用CodeIgniters回调函数,该函数检查日期是否有效.

要检查它是否有效,您可以使用PHP的checkdate函数

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为这也是要走的路。一件事,函数的名称必须没有“回调”。所以正确的方法是&gt; function date_valid($date){ (2认同)

Joh*_*oha 14

我有一个非常干净的解决方案.您可以扩展codeigniters表单验证库.

通过将MY_Form_validation.php文件放在application/libraries文件夹中来完成此操作.此文件应如下所示:

class MY_Form_validation extends CI_Form_validation {

public function __construct($rules = array())
{
    parent::__construct($rules);
}


public function valid_date($date)
{
    $d = DateTime::createFromFormat('Y-m-d', $date);
    return $d && $d->format('Y-m-d') === $date;
}
}
Run Code Online (Sandbox Code Playgroud)

要添加错误消息,请转到application/language /文件夹并打开form_validation_lang.php文件.在文件末尾的$ lang数组中添加一个条目,如下所示:

$lang['form_validation_valid_date'] = 'The field {field} is not a valid date';
Run Code Online (Sandbox Code Playgroud)

请注意,此处的键必须与函数名称(valid_date)相同.

然后在你的控制器中你使用它作为任何其他表单验证函数,例如'required'

$this->form_validation->set_rules('date','Date','trim|required|valid_date');
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常优雅的解决方案,我想建议一个额外的更改,以允许更好的自定义.添加日期格式的参数:function valid_date($ date,$ format ='Ym-d')并在函数中引用它.您可以在验证规则中传递此参数,例如:'trim | required | valid_date [dmy]'然后lang文件可以使用{param}指定错误时的预期格式. (3认同)

Abi*_*sia 8

你可以做到 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}]'); 
Run Code Online (Sandbox Code Playgroud)

  • 使用正则表达式实现可靠的日期验证是不可能的.你的实际上相当不错,但是,例如,它声称"29-02-2000"无效. (4认同)
  • 是的,对,如果你有耐心,你可以硬编码所有的例外(包括由于过渡到公历而缺少的日子),但你知道我的意思:正则表达式不是最好的工具. (3认同)