笨 - 日期格式 - 表单验证(Codeigniter - Date format - Form V

2019-07-18 06:50发布

我使用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为正确的日期验证?

Answer 1:

你可以做到这一点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}]'); 


Answer 2:

您可以使用CodeIgniters回调函数通过创建检查日期是无效的callback_date_valid()函数。

并检查它是否有效,你可以使用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);
}


Answer 3:

我对此有一个漂亮干净的解决方案。 您可以扩展codeigniters表单验证库。

通过把一个文件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; } } 

要添加错误消息,你走你的应用程序/语言/文件夹,打开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');


Answer 4:

我知道这是老了,但我只是遇到了同样的问题。 我想提供的答案使眼色,却发现代码没有工作。 我把它修改成这样:

  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;
  }


Answer 5:

有一个在笨没有内置日期验证form_validation库,但你可以使用它的回调调用函数和验证使用PHP的自身能力的日期。

随着日期时间,你可以为所有格式最短的日期和时间的验证。

function validateDate($date, $format = 'Y-m-d 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', 'Y-m-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', 'Y-m-d\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 M Y H: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



Answer 6:

我想提供的答案tmsimont,但发现如果非数值照耀处的代码没有工作。 修改后的代码被赋予如下:

/**
    * 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;
    }


Answer 7:

对于笨日期验证实际的正则表达式:

$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 /月/年

没有警告和错误:-)



Answer 8:

我写了这CI3自定义验证 - 验证d / M / YH:我的格式 - 您可以轻松地改变这种状况。

$this->form_validation->set_rules("start_date", "Start Date", 'trim|callback__check_date_valid');


   public function _check_date_valid($date){

    $this->form_validation->set_message('_check_date_valid', "Please enter a valid date");
    $d = DateTime::createFromFormat('d/m/Y H:i', $date);

    if($d && $d->format('d/m/Y H:i') === $date || $date == ''){
        return true;
    }else{

        return false;
    }

}


Answer 9:

试试这个...我认为它更简单。

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

function checkDateFormat($date) {
        $d = DateTime::createFromFormat('Y-m-d', $date);
        if(($d && $d->format('Y-m-d') === $date) === FALSE){
            $this->form_validation->set_message('checkDateFormat', ''.$date.' is not a valid date format.');
            return FALSE;
        }else{
            return TRUE;
        }
}


Answer 10:

使用正则表达式可能是最好的办法。 我用这个正则表达式,我发现这里的格式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])$/]');


文章来源: Codeigniter - Date format - Form Validation