如何制作检查生日输入的表达式以匹配此dd / mm / yyyy这样的格式?以下是我到目前为止所发布的内容,但如果我把99/99/9999付诸实施,也需要这样做!
if (!preg_match("/[0-9]{2}\/[0-9]{2}\/[0-9]{4}/", $cnt_birthday))
{
$error = true;
echo '<error elementid="cnt_birthday" message="BIRTHDAY - Only this birthday format - dd/mm/yyyy - is accepted."/>';
}
如何确保dd仅为01到31,mm为01到12?但我相信如何限制yyyy ...我认为理论9999应该是可以接受的......如果你有更好的主意,请告诉我!
感谢, 刘
答案 0 :(得分:25)
我建议改为使用checkdate():
if (preg_match("/([0-9]{2})\/([0-9]{2})\/([0-9]{4})/", $cnt_birthday, $matches)) {
if (!checkdate($matches[2], $matches[1], $matches[3])) {
$error = true;
echo '<error elementid="cnt_birthday" message="BIRTHDAY - Please enter a valid date in the format - dd/mm/yyyy"/>';
}
} else {
$error = true;
echo '<error elementid="cnt_birthday" message="BIRTHDAY - Only this birthday format - dd/mm/yyyy - is accepted."/>';
}
因此regexp验证格式,checkdate验证实际日期。
答案 1 :(得分:22)
可以使用explode
轻松完成日,月和年的提取:
list($dd,$mm,$yyyy) = explode('/',$cnt_birthday);
if (!checkdate($mm,$dd,$yyyy)) {
$error = true;
}
答案 2 :(得分:3)
考虑使用strtotime()
并将其重新格式化为date()
。在输入日期时,它将为用户提供更大的灵活性,让您在不同的地方使用您需要的任何格式。
就个人而言,在准确的日期计算方面我非常懒惰,并且像strtotime("-10 day",$timestamp)
一样滥用它。由于你计算了他们的小女儿年龄刚好超过18岁,而不是正确地计算闰年,并且让她到你的成人主题网站,这可能听起来很荒谬,这有利于被一个生气的父母起诉的可能性降低。 / p>
答案 3 :(得分:3)
if(preg_match("/(\d{2})\/(\d{2})\/(\d{4})$/", $date,$matches)){
return (checkdate((int) $matches[2],(int)$matches[1],(int) $matches[3]) );
}else{
return false ;
}
答案 4 :(得分:2)
$ok = DateTime::createFromFormat('d/m/Y',$datestring)->format('d/m/Y') == $datestring;
PHP&gt; = 5.3
答案 5 :(得分:1)
要真正具有肛门保持力,可能更容易使用当前的正则表达式,解析数字,然后验证它们在checkdate()的范围内,但是对于踢,这里是确保日期的正则表达式= 01-31(和1-9),月= 01-12(和1-9)。
preg_match("/([012]?[1-9]|[12]0|3[01])\/(0?[1-9]|1[012])\/([0-9]{4})/", $date_string)
注意事项
|
)所需的全部分组,但如果你想用它们做特定的事情,也可以提取这些值答案 6 :(得分:1)
也许这样的事情会有所帮助
list($month,$day,$year)=explode("/",$date);
if(checkdate($month,$day,$year))
{
echo "good";
}
else{echo "bad";}
答案 7 :(得分:0)
只接受严格格式化的字符串可能是一种不好的做法。假设您正在从网页获取输入,那么最好有月,日和年的单独字段。它们可能只是文本框,但最好有下拉菜单,这可以解决你的限制问题(即月份的唯一选择是1,2,...,12)。要求用户输入01/01/2001而不接受1/1/2001是懒惰编程。只接受“/”作为分隔符是很尴尬的。
但是,即使您决定坚持使用格式化的字符串,也要触及原始问题 - 因为它是一个生日字段,您应该将yyyy限制为:
if($yyyy > date('Y')) {
echo '<error elementid="cnt_birthday" message="BIRTHDAY - Year must be less than or equal to the current year."/>';
}
否则人们可能会有负面年龄:)
答案 8 :(得分:0)
可能不是最好的解决方案,但这是我的尝试。
将其转换为时间,然后将其重新格式化为m / d / Y.如果字符串没有改变,那么它的格式就是正确的格式。
$transformedDate = date("m/d/Y", strtotime($myDate));
if($transformedDate == $myDate){
return true;
} else{
return false;
}
答案 9 :(得分:0)
试试这个正则表达式:([0-9]{2}\/[0-9]{2}\/[0-9]{4})
答案 10 :(得分:0)
我很晚才看到这个,但这解决了我的问题
if (1 !== preg_match('/(0[1-9]|1[0-9]|2[0-9]|3(0|1))\/(0[1-9]|1[0-2])\/\d{4}/',$value)) {
$this->form_validation->set_message('validate_emaildate','Date needs to have a valid date format - dd/mm/yyyy');
return FALSE;
}
提供以下帖子:
正则表达式格式here ..感谢Abin。
检查格式[此处]的功能 (Codeigniter's regex match) ..感谢Hashem
+欢呼声