三个字段分开的话比较容易判断。连在一起的话,这样的涉及本身就有缺陷:
如: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";
}

解决方案 »

  1.   

    为什么不用checkdate这个函数呢?
    有必要三个字段吗?一个字段就足够了!
      

  2.   

    thanks,我本想连在一起考虑太复杂了,所以决定分开
    '^(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])$'
    这样的话判断闰月闰年仍旧是麻烦阿
      

  3.   

    checkdate后,可以格式化成日期,加前导0就可以了.
      

  4.   

    <?php
    # @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] - 年份最后三项可进一步确认数据有效性希望以上代码对你有所帮助
      

  5.   

    你将下划线更改下,发出去后被CSDN系统替换了.改了就可以测试了