preg_match:检查生日格式(年/月/日)

时间:2010-09-15 19:13:20

标签: php regex preg-match

如何制作检查生日输入的表达式以匹配此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应该是可以接受的......如果你有更好的主意,请告诉我!

感谢, 刘

11 个答案:

答案 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)

基于Tim基于checkdate的解决方案:

可以使用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 ;
}
  • preg_match验证模式dd / mm / yyyy
  • checkdate以验证日期值

答案 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)

注意事项

  • 我已经使用了ORing(|)所需的全部分组,但如果你想用它们做特定的事情,也可以提取这些值
  • 0000作为约会并没有多大意义,但是我把这个正则表达式的爆炸留给了读者。如果你真的希望这可以验证出生日期(并且你期望目前或相对最近已故的人)限制说1900+或1800+,或任何可接受的范围。如果你可能正在解析历史人物的生日......你的电话。
  • 这仍然无法检查相关月份的日期范围是否正确!因此,使用checkdate()

答案 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

+欢呼声