身份证合法性验证

2015年10月14日 16:42:22

从网上扒的, 删掉了一小段无用代码, 修改了一行判断省份的代码

 1 /*
 2  * 身份证号验证(兼容15,18位)
 3  */
 4 function checkIdentityCode($idcard)
 5 {
 6     $idcard = trim($idcard);//去掉两边空格, 0无影响
 7     $return = array('status'=>0, 'msg'=>'');
 8     if( empty($idcard) ){
 9         $return['msg'] = '身份证号码不能够为空';
10         return $return;
11     }
12     $city = array(
13         11=>'北京',12=>'天津',13=>'河北',14=>'山西',15=>'内蒙古',21=>'辽宁',
14         22=>'吉林',23=>'黑龙江',31=>'上海',32=>'江苏',33=>'浙江',34=>'安徽',
15         35=>'福建',36=>'江西',37=>'山东',41=>'河南',42=>'湖北',43=>'湖南',
16         44=>'广东',45=>'广西',46=>'海南',50=>'重庆',51=>'四川',52=>'贵州',
17         53=>'云南',54=>'西藏',61=>'陕西',62=>'甘肃',63=>'青海',64=>'宁夏',
18         65=>'新疆',71=>'台湾',81=>'香港',82=>'澳门',91=>'国外');
19     $iSum = 0;
20     $idCardLength = strlen($idcard);
21     //长度验证
22     if(!preg_match('/^\d{17}(\d|x)$/i', $idcard) && !preg_match('/^\d{15}$/i', $idcard)) {
23         $return['msg'] = '长度不正确';
24         return $return;
25     }
26     //地区验证
27     $areaCode = substr($idcard,0,2);
28     if(empty($city[$areaCode])) {
29         $return['msg'] = '身份证号码的地区编号错误';
30         return $return;
31     }
32     // 15位身份证验证生日
33     if ($idCardLength == 15) {
34         $sBirthday = '19'.substr($idcard,6,2).'-'.substr($idcard,8,2).'-'.substr($idcard,10,2);
35         $d = new DateTime($sBirthday);
36         $dd = $d->format('Y-m-d');
37         if($sBirthday != $dd) {
38             $return['msg'] = '身份证号码的生日错误';
39             return $return;
40         }
41     } else {
42         // 判断是否大于2078年,小于1900年
43         $year = substr($idcard,6,4);
44         if ($year<1900 || $year>2078 ) {
45             $return['msg'] = '身份证号码的出生年份错误';
46             return $return;
47         }
48 
49         //18位身份证处理
50         $sBirthday = substr($idcard,6,4).'-'.substr($idcard,10,2).'-'.substr($idcard,12,2);
51         $d = new DateTime($sBirthday);
52         $dd = $d->format('Y-m-d');
53         if($sBirthday != $dd) {
54             $return['msg'] = '身份证号码的出生年月日错误';
55             return $return;
56         }
57         //身份证编码规范验证
58         $idcard_base = substr($idcard,0,17);
59         if(strtoupper(substr($idcard,17,1)) != getVerifyBit($idcard_base)) {
60             $return['msg'] = '身份证编码不符合规范验证';
61             return $return;
62         }
63     }
64     $return['status'] = 1;
65     return $return;
66 }
67 
68 // 计算身份证校验码,根据国家标准GB 11643-1999
69 function getVerifyBit($idcard_base)
70 {
71     if (strlen($idcard_base) != 17) {
72         return false;
73     }
74     //加权因子
75     $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
76     //校验码对应值
77     $verify_number_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4','3', '2');
78     $checksum = 0;
79     for ($i = 0; $i < strlen($idcard_base); $i++) {
80         $checksum += substr($idcard_base, $i, 1) * $factor[$i];
81     }
82     $mod = $checksum % 11;
83     $verify_number = $verify_number_list[$mod];
84     return $verify_number;
85 }

 

posted @ 2015-10-14 16:44  myD  阅读(951)  评论(0编辑  收藏  举报