身份证合法性验证

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 }
时间: 2024-08-28 21:25:33

身份证合法性验证的相关文章

SQL Server 验证身份证合法性函数(使用VBScript.RegExp)

原文:SQL Server 验证身份证合法性函数(使用VBScript.RegExp) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wzy0623/article/details/53895680 -- 建立正则表达式测试函数 CREATE FUNCTION dbo.RegExpTest ( @source VARCHAR(5000), --需要匹配的源字符串 @regexp VARCHAR(1000), --正则表达式 @ignorecas

简单的关于身份证(15位或者18位)合法性验证

package com.clark.test.idcard; /** * 测试校验身份证合法性的小程序 * <p>我们常用的身份证号码为18位或者15位</p> <p>下面的程序仅仅用于校验18为的身份证的合法性</p> * @author caolipeng * @date 2015年1月9日 上午10:27:13 * @Version 1.0 */ public class IDCardValidator { <span style="c

js实现身份证号码验证

/*根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码.地址码表示编码对象常住户口所在县(市.旗.区)的行政区划代码.出生日期码表示编码对象出生的年.月.日,其中年份用四位数字表示,年.月.日之间不用分隔符.顺序码表示同一地址码所标识的区域范围内,对同年.月.日出生的人员编定的顺序号.顺序码的奇数分给男性,偶

js正则实现二代身份证号码验证详解

js正则实现二代身份证号码验证详解 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 地址码表示编码对象常住户口所在县(市.旗.区)的行政区划代码. 出生日期码表示编码对象出生的年.月.日,其中年份用四位数字表示,年.月.日之间不用分隔符. 顺序码表示同一地址码所标识的区域范围内,对同年.月.日出生的人员

java身份证合法性校验并获取并根据身份证号提取身份证相关信息

/** * 身份证前6位[ABCDEF]为行政区划数字代码(简称数字码)说明(参考<GB/T 2260-2007 中华人民共和国行政区划代码>): * 该数字码的编制原则和结构分析,它采用三层六位层次码结构,按层次分别表示我国各省(自治区,直辖市,特别行政区). * 市(地区,自治州,盟).县(自治县.县级市.旗.自治旗.市辖区.林区.特区). 数字码码位结构从左至右的含义是: 第一层为AB两位代码表示省.自治区.直辖市.特别行政区: 第二层为CD两位代码表示市.地区.自治州.盟.直辖市所辖市

C#实现身份证号码验证的方法

本文实例讲述了C#实现身份证号码验证的方法.分享给大家供大家参考.具体实现方法如下: 随着现在互联网的发展,越来越多的注册用户的地方都用到了身份证,那么对于输入的身份证如何验证呢?看下面的代码,其实很简单. 主要注意的是,目前的身份证分为16和18位,然后分别验证校验位,省份,生日即可. 主要类如下: /// <summary> /// 验证身份证号码类 /// </summary> public class IDCardValidation { /// <summary&g

手机号码和电话号码合法性验证代码

手机号码和电话号码合法性验证代码: 在某些网站电话号码和手机号码都是必填的,或者说需要填写其中的一项,为了增强网站的真实性也提高用户体验,一般需要进行进行格式合法性验证,下面是摘自网络上的一段验证代码供大家参考之用,希望能够给大家带来一定的帮助. 代码如下: function Checkreg(){ //验证电话号码手机号码,包含153,159号段 if(document.form.phone.value==""&&document.form.UserMobile.va

javascript身份证号码验证

https://github.com/oxcow/id-number-validator 版权声明: 关于<javascript身份证号码验证>的一切权利归作者@Leeyee所有: 非商用.非衍生; 如需转载需要注明来源于http://iyiguo.net/blog/2013/07/31/javascript-idcard-validate/ 15位身份证号码编码规则 18位身份证号码编码规则 校验规则 javascript编码实现 源代码 验证示例 15位身份证号码编码规则 ddddddyy

编程乐趣:身份证号码验证的方法

随着如今互联网的发展,越来越多的注冊用户的地方都用到了身份证.那么对于输入的身份证怎样验证呢?看以下的代码,事实上非常easy.主要注意的是,眼下的身份证分为16和18位,然后分别验证校验位.省份,生日就可以.主要类: /// <summary> /// 验证身份证号码类 /// </summary> public class IDCardValidation { /// <summary> /// 验证身份证合理性 /// </summary> /// &