php身份证验证

php身份证验证方法,身份证号码验证算法

18身份证号码的结构
  公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。
  排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。
1、地址码
  表示编码对象常住户口所在县(市、旗、区)的行政区域划分代码,按GB/T2260的规定执行。
2、出生日期码
  表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
3、顺序码
  表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
4、校验码计算步骤
(1)十七位数字本体码加权求和公式
  S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和
  Ai:表示第i位置上的身份证号码数字值(0~9)
  Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 (表示第i位置上的加权因子)
(2)计算模
  Y = mod(S, 11)
(3)根据模,查找得到对应的校验码
  Y: 0 1 2 3 4 5 6 7 8 9 10
  校验码: 1 0 X 9 8 7 6 5 4 3 2

  1. //验证身份证号码是否有效号码  
  2. function validation_filter_id_card($id_card){  
  3.     if(strlen($id_card)==18){  
  4.         return idcard_checksum18($id_card);  
  5.     }elseif((strlen($id_card)==15)){  
  6.         $id_card=idcard_15to18($id_card);  
  7.         return idcard_checksum18($id_card);  
  8.     }else{  
  9.         return false;  
  10.     }  
  11. }  
  12. // 计算身份证校验码,根据国家标准GB 11643-1999  
  13. function idcard_verify_number($idcard_base){  
  14.     if(strlen($idcard_base)!=17){  
  15.         return false;  
  16.     }  
  17.     //加权因子  
  18.     $factor=array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);  
  19.     //校验码对应值  
  20.     $verify_number_list=array('1','0','X','9','8','7','6','5','4','3','2');  
  21.     $checksum=0;  
  22.     for($i=0;$i<strlen($idcard_base);$i++){  
  23.         $checksum += substr($idcard_base,$i,1) * $factor[$i];  
  24.     }  
  25.     $mod=$checksum % 11;  
  26.     $verify_number=$verify_number_list[$mod];  
  27.     return $verify_number;  
  28. }  
  29. // 将15位身份证升级到18位  
  30. function idcard_15to18($idcard){  
  31.     if(strlen($idcard)!=15){  
  32.         return false;  
  33.     }else{  
  34.         // 如果身份证顺序码是996 997 998 999,这些是为百岁以上老人的特殊编码  
  35.         if(array_search(substr($idcard,12,3),array('996','997','998','999')) !== false){  
  36.             $idcard=substr($idcard,0,6).'18'.substr($idcard,6,9);  
  37.         }else{  
  38.             $idcard=substr($idcard,0,6).'19'.substr($idcard,6,9);  
  39.         }  
  40.     }  
  41.     $idcard=$idcard.idcard_verify_number($idcard);  
  42.     return $idcard;  
  43. }  
  44. // 18位身份证校验码有效性检查  
  45. function idcard_checksum18($idcard){  
  46.     if(strlen($idcard)!=18){  
  47.         return false;  
  48.     }  
  49.     $idcard_base=substr($idcard,0,17);  
  50.     if(idcard_verify_number($idcard_base)!=strtoupper(substr($idcard,17,1))){  
  51.         return false;  
  52.     }else{  
  53.         return true;  
  54.     }  
  55. }  

PS:
1.该程序可以剔除验证码不正确的身份证号码。
2.15位的身份证出生年份采用年份后2位,没有*后1位校验码。
3.完整的身份证18位,*后一位校验位可能是非数字。我们的一个项目,数据库保存前17位数字。

本文最后更新于 2016-03-09 22:32:41 并被添加「验证类 安全校验」标签,已有 1987 位童鞋阅读过。
本文作者:未来往事
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处

相关文章

此处评论已关闭