三个字段分开的话比较容易判断。连在一起的话,这样的涉及本身就有缺陷:
如:1212008 (是12月1号?还是 1月21号 这类的问题)。简单实现如下,当然没有判断闰月的之类的复杂情况。
$s = '01212008';if (preg_match("/^(?:0?[1-9]|1[0-2])(?:0?[1-9]|[1-2][0-9]|3[0-1])(?:19[0-9]{2}|200[0-9]|2010)$/",$s)) {
echo "Y";
}
else {
echo "N";
}
如:1212008 (是12月1号?还是 1月21号 这类的问题)。简单实现如下,当然没有判断闰月的之类的复杂情况。
$s = '01212008';if (preg_match("/^(?:0?[1-9]|1[0-2])(?:0?[1-9]|[1-2][0-9]|3[0-1])(?:19[0-9]{2}|200[0-9]|2010)$/",$s)) {
echo "Y";
}
else {
echo "N";
}
有必要三个字段吗?一个字段就足够了!
'^(0?[1-9]|1[0-2])$'
'^((0?[1-9])|((1|2)[0-9])|30|31)$'
'^(1?(8|9)[0-9][0-9])|(2?(0)(0)[0-8])$'
这样的话判断闰月闰年仍旧是麻烦阿
# @title 测试匹配 MMDDYYYY 格式日期
# @author sports98 at gmail dot com
# @link http://topic.csdn.net/u/20080514/15/820c42ff-37ff-4dc3-956f-658c27ab701f.html$as = array(
"0003100",
"123",
"abcddd",
"01011900",
"02142008",
"01001998",
"00151999",
"02270023"
);for($i=0;$i<count($as);$i++)
{
preg_match("/((?:0[1-9]{1})|(?:1[0-9]{1}))((?:0[1-9]{1})|(?:[1-2][0-9]{1})|(?:3[0-1]{1}))((?:19|20)[0-9]{2})$/",$as[$i],$matched);
echo "<li>".$as[$i];
if(count($matched)>0)
{
echo " -- <font color=red>有效</font>\r\n";
}
else
{
echo " -- 无效\r\n";
}
print_r($matched);
}
?> 以上代码还存在闰年无法计算问题以及类似
02311900 这样的日期也会被分析为合理日期
不过以上的可以快速过滤出你需要的日期,如果需要进行闰年验证,建议将匹配出的 $matched 分析后处理
$matched[0] - 分析字串
$matched[1] - 月份
$matched[2] - 日期
$matched[3] - 年份最后三项可进一步确认数据有效性希望以上代码对你有所帮助