身份证合法性验证
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 }