身份证合法性验证

简介: 2015年10月14日 16:42:22 从网上扒的, 删掉了一小段无用代码, 修改了一行判断省份的代码 1 /* 2 * 身份证号验证(兼容15,18位) 3 */ 4 function checkIdentityCode($idcard) 5 { 6 $...

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 }

 

目录
相关文章
|
5月前
|
前端开发 JavaScript
JS前端实现身份证号码合法性校验(校验码校验)
JS前端实现身份证号码合法性校验(校验码校验)
129 0
|
安全 API 数据库
一文带你了解银行卡验证api接口
银行卡验证api接口指的是通过天眼数聚这样的合规性api接口服务商,接入银联数据库,对用户提供的银行卡信息进行真实性核验的一种实名认证方法
964 0
一文带你了解银行卡验证api接口
|
API 数据库
身份证实名认证接口验证不一致的原因
身份证是每个公民最常用的身份证明,随着当今互联网的快速发展,日常生活中越来越多的场景需要进行身份核验,以身份证实名认证为基础的网络实名制也引起了各行业的关注,随着实名制认证应用情景的多元化,众多网络平台对实名制验证机制的要求也越发严格。
424 0
身份证实名认证接口验证不一致的原因
|
测试技术
身份证号合法性判别
身份证号合法性判别
185 0
|
Java
Java实现身份证号码验证
整理文档时,搜刮出一个Java实现身份证号码验证源码示例代码,稍微整理精简了一下分享给大家。
320 0
|
算法 iOS开发
iOS小知识:银行卡号有效性校验
iOS小知识:银行卡号有效性校验
396 0
iOS小知识:银行卡号有效性校验
|
算法 API iOS开发
iOS 银行卡号有效性校验
iOS 银行卡号有效性校验
535 0
iOS 银行卡号有效性校验
电话号码验证器(FreeCodeCamp)
电话号码验证器(FreeCodeCamp)
347 0
电话号码验证器(FreeCodeCamp)
|
Web App开发 JavaScript