function checkIdCard($idcard){ $City = array(11=>'北京',12=>'天津',13=>'河北',14=>'山西',15=>'内蒙古',21=>'辽宁',22=>'吉林',23=>'黑龙江',31=>'上海',32=>'江苏',33=>'浙江',34=>'安徽',35=>'福建',36=>'江西',37=>'山东',41=>'河南',42=>'湖北',43=>'湖南',44=>'广东',45=>'广西',46=>'海南',50=>'重庆',51=>'四川',52=>'贵州',53=>'云南',54=>'西藏',61=>'陕西',62=>'甘肃',63=>'青海',64=>'宁夏',65=>'新疆',71=>'台湾',81=>'香港',82=>'澳门',91=>'国外'); $iSum = 0; $idCardLength = strlen($idcard); //长度验证 if(!preg_match("/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}(\d|x|X)$/", $idcard) && !preg_match("/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/", $idcard)) { return false; } //地区验证 if(!array_key_exists(intval(substr($idcard,0,2)),$City)) { return false; } // 15位身份证验证生日,转换为18位 if ($idCardLength == 15) { $sBirthday = '19'.substr($idcard,6,2).'-'.substr($idcard,8,2).'-'.substr($idcard,10,2); $d = new DateTime($sBirthday); $dd = $d->format('Y-m-d'); if($sBirthday != $dd) { return false; } $idcard = substr($idcard,0,6).'19'.substr($idcard,6,9);//15to18 $Bit18 = getVerifyBit($idcard);//算出第18位校验码 $idcard = $idcard.$Bit18; } // 判断是否大于2078年,小于1900年 $year = substr($idcard,6,4); if ($year2078 ) { return false; } //18位身份证处理 $sBirthday = substr($idcard,6,4).'-'.substr($idcard,10,2).'-'.substr($idcard,12,2); $d = new DateTime($sBirthday); $dd = $d->format('Y-m-d'); if($sBirthday != $dd) { return false; } //身份证编码规范验证 $idcard_base = substr($idcard,0,17); if(strtoupper(substr($idcard,17,1)) != getVerifyBit($idcard_base)) { return false; } return true; }
public function checkIdCard($idcard) { if (empty($idcard)) { return false; } $City = array(11 => "北京", 12 => "天津", 13 => "河北", 14 => "山西", 15 => "内蒙古", 21 => "辽宁", 22 => "吉林", 23 => "黑龙江", 31 => "上海", 32 => "江苏", 33 => "浙江", 34 => "安徽", 35 => "福建", 36 => "江西", 37 => "山东", 41 => "河南", 42 => "湖北", 43 => "湖南", 44 => "广东", 45 => "广西", 46 => "海南", 50 => "重庆", 51 => "四川", 52 => "贵州", 53 => "云南", 54 => "西藏", 61 => "陕西", 62 => "甘肃", 63 => "青海", 64 => "宁夏", 65 => "新疆", 71 => "台湾", 81 => "香港", 82 => "澳门", 91 => "国外"); $iSum = 0; $idCardLength = strlen($idcard); //长度验证 if (!preg_match('/^\\d{17}(\\d|x)$/i', $idcard) and !preg_match('/^\\d{15}$/i', $idcard)) { return false; } //地区验证 if (!array_key_exists(intval(substr($idcard, 0, 2)), $City)) { return false; } // 15位身份证验证生日,转换为18位 if ($idCardLength == 15) { $sBirthday = '19' . substr($idcard, 6, 2) . '-' . substr($idcard, 8, 2) . '-' . substr($idcard, 10, 2); $d = new DateTime($sBirthday); $dd = $d->format('Y-m-d'); if ($sBirthday != $dd) { return false; } $idcard = substr($idcard, 0, 6) . "19" . substr($idcard, 6, 9); //15to18 $Bit18 = getVerifyBit($idcard); //算出第18位校验码 $idcard = $idcard . $Bit18; } // 判断是否大于2078年,小于1900年 $year = substr($idcard, 6, 4); if ($year < 1900 || $year > 2078) { return false; } //18位身份证处理 $sBirthday = substr($idcard, 6, 4) . '-' . substr($idcard, 10, 2) . '-' . substr($idcard, 12, 2); $d = new DateTime($sBirthday); $dd = $d->format('Y-m-d'); if ($sBirthday != $dd) { return false; } //身份证编码规范验证 $idcard_base = substr($idcard, 0, 17); if (strtoupper(substr($idcard, 17, 1)) != $this->getVerifyBit($idcard_base)) { return false; } else { return true; } }