我正在使用 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
以进行正确的日期验证?
答案 0 :(得分:19)
您可以通过创建callback_date_valid()函数来使用CodeIgniters callback functions,该函数检查日期是否有效。
要检查它是否有效,您可以使用PHP's checkdate function
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);
}
答案 1 :(得分: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;
}
}
要添加错误消息,请转到application / language /文件夹并打开form_validation_lang.php文件。在文件末尾的$ lang数组中添加一个条目,如下所示:
$lang['form_validation_valid_date'] = 'The field {field} is not a valid date';
请注意,此处的键必须与函数名称(valid_date)相同。
然后在您的控制器中,您将其用作任何其他表单验证功能,例如&#39; required&#39;
$this->form_validation->set_rules('date','Date','trim|required|valid_date');
答案 2 :(得分:7)
您可以使用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}]');
答案 3 :(得分:1)
我知道这是旧的,但我刚遇到同样的问题。我喜欢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;
}
答案 4 :(得分:1)
Codeigniter form_validation
库中没有内置日期验证,但您可以使用其回调来调用函数并使用PHP自己的功能验证日期。
使用DateTime,您可以为所有格式制作最短的日期和时间验证器。
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
复制
答案 5 :(得分:0)
我喜欢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;
}
答案 6 :(得分:0)
我已经为ci3编写了此自定义验证器-验证d / m / Y H:i格式-您可以轻松更改它。
$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;
}
}
答案 7 :(得分:0)
尝试一下...我认为这更简单。
$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;
}
}
答案 8 :(得分:0)
根据iamyojimbo的回答,
$date = [
'28.02.2012', // true
'28/02/2012', // true
'28-02-2012', // true
'28 02 2012', // true
'28 02 1812', // false
];
$pattern = '/^(0[1-9]|[12][0-9]|3[01])[\.\/\-\ ](0[1-9]|1[012])[\.\/\-\ ](19|20)\d\d$/';
foreach ($date as $subject) {
print_r(
preg_match(
$pattern,
$subject
)
);
}
答案 9 :(得分:-2)
使用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])$/]');