PHP实现身份证号正则验证(兼容15,18位)

 

最近复习了正则表达式的使用,手痒痒就做了一份验证正则,身份证号验证(兼容15,18位) ,在注册验证的时候可以用上。

 

01 //比较菜鸟 第一次分享代码  
02 //身份证号验证
03     protected function checkIdCard(){
04         if(empty($_POST['idcard'])){
05             return false;
06         }
07         $idcard = $_POST['idcard'];
08         $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=>"国外");
09         $iSum = 0;
10         $idCardLength = strlen($idcard);
11         //长度验证
12         if(!preg_match('/^\d{17}(\dx)$/i',$idcard) and!preg_match('/^\d{15}$/i',$idcard))
13         {
14             return false;
15         }
16         //地区验证
17         if(!array_key_exists(intval(substr($idcard,0,2)),$City))
18         {
19            return false;
20         }
21         // 15位身份证验证生日,转换为18位
22         if ($idCardLength == 15)
23         {
24             $sBirthday = '19'.substr($idcard,6,2).'-'.substr($idcard,8,2).'-'.substr($idcard,10,2);
25             $d = new DateTime($sBirthday);
26             $dd = $d->format('Y-m-d');
27             if($sBirthday != $dd)
28             {
29                 return false;
30             }
31             $idcard = substr($idcard,0,6)."19".substr($idcard,6,9);//15to18
32             $Bit18 = getVerifyBit($idcard);//算出第18位校验码
33             $idcard = $idcard.$Bit18;
34         }
35         // 判断是否大于2078年,小于1900年
36         $year = substr($idcard,6,4);
37         if ($year<1900  $year>2078 )
38         {
39             return false;
40         }
41  
42         //18位身份证处理
43         $sBirthday = substr($idcard,6,4).'-'.substr($idcard,10,2).'-'.substr($idcard,12,2);
44         $d = new DateTime($sBirthday);
45         $dd = $d->format('Y-m-d');
46         if($sBirthday != $dd)
47          {
48             return false;
49          }
50         //身份证编码规范验证
51         $idcard_base = substr($idcard,0,17);
52         if(strtoupper(substr($idcard,17,1)) != getVerifyBit($idcard_base))
53         {
54            return false;
55         }
56         return $_POST['idcard'];
57     }
58  
59     // 计算身份证校验码,根据国家标准GB 11643-1999
60     function getVerifyBit($idcard_base)
61     {
62         if(strlen($idcard_base) != 17)
63         {
64             return false;
65         }
66         //加权因子
67         $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
68         //校验码对应值
69         $verify_number_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4','3', '2');
70         $checksum = 0;
71         for ($i = 0; $i < strlen($idcard_base); $i++)
72         {
73             $checksum += substr($idcard_base, $i, 1) * $factor[$i];
74         }
75         $mod = $checksum % 11;
76         $verify_number = $verify_number_list[$mod];
77         return $verify_number;
78     }
时间: 2024-12-30 06:30:06

PHP实现身份证号正则验证(兼容15,18位)的相关文章

jsp身份证号码验证代码(15,18位)

<%@ page contenttype="text/html; charset=gb2312" language="java" import="java.sql.*" errorpage="" %> <!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml

java-.jsp文件里身份证号怎么验证啊

问题描述 .jsp文件里身份证号怎么验证啊 要求判断必须是15位或18位数字,js代码怎么写呀?我这么写有问题么?为什么不好使呀? 解决方案 改为onblur,keyup没输入一个数字就替换一次,你肯定不可能一次keyup就全部输入所有的15或者18位数字了 解决方案二: 不能写在keyup里面,要写在onblur里面 解决方案三: 另外最好出错给出提示,而不是粗暴地删除,这样用户体验不好. 解决方案四: function isCardNo(card) { // 身份证号码为15位或者18位,1

javascript身份证号有效性验证实现程序

地址码表示编码对象常住户口所在县(市.旗.区)的行政区划代码. 出生日期码表示编码对象出生的年.月.日,其中年份用四位数字表示,年.月.日之间不用分隔符. 顺序码表示同一地址码所标识的区域范围内,对同年.月.日出生的人员编定的顺序号.顺序码的奇数分给男性 偶数分给女性. 校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码. 出生日期计算方法 15位的身份证编码首先把出生年扩展为4位,简单的就是增加一个19或18,这样就包含了所有1800-1999

15/18位身份证号码验证的正则表达式总结(详细版)

前言 开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单.效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧. 介绍 xxxxxx yyyy MM dd 375 0     十八位 xxxxxx    yy MM dd   75 0     十五位 地区: [1-9]\d{5} 年的前两位: (18|19|([23]\d))            1800-2399 年的后两位: \d{2} 月份: ((0[1-9])|(10|11|12)) 天

JavaScript 身份证号有效验证详解及实例代码_javascript技巧

最近需要对身份证合法性进行验证,实名验证是不指望了,不过原来的验证规则太过简单,只是简单的验证了身份证长度,现在业务需要加强下身份证验证规则,网上找到了不少资料,不过都不合偶的心意,无奈只好直接写一个,代码还是用自己的舒服哈 JavaScript验证身份证号 <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%>

JS验证身份证号地区码及最后一位校验码

/* 参数为身份证号 返回正确校验码 */ function getjy(id) {     var arr = new Array();//分别取出身份证的前17位加入到这个数组     var arr1 = new Array();//对向相应的次方     var num = 0;     for (var i = 0; i < 17; i++) {         arr[i] = id.charAt(i);     }     for (var i = 0; i < arr.leng

javascript身份证检验正则表达式(支持15,18位及省份差别)

做这个其实不难,在网上多找一下总会有意外收获的.但是工欲善其事,必先利其器.我们需要了解一下身份证号的规则,知己知彼百战不殆. 身份证号有15位和18位长度两种,15位的时候,都是数字,但是18位长度的时候可能有校验位(X),所以只校验数字是不够的了. 另外身份证号可以看出一个人的年龄,出生所在地(身份证所在地?)等等,这些对我们来讲都是有用的数据.  代码如下 复制代码 <script type='text/javascript' src='card.js'></script>

超精准的javascript验证身份证号的具体实现方法_javascript技巧

编写程序前先来了解下身份证号的构成: 身份证号分为两种,旧的为15位,新的为18位. 身份证15位编码规则:dddddd yymmdd xx p    其中 dddddd:地区码    yymmdd: 出生年月日    xx: 顺序类编码,无法确定    p: 性别,奇数为男,偶数为女: 身份证18位编码规则:dddddd yyyymmdd xxx y    其中 dddddd:地区码    yyyymmdd: 出生年月日     xxx:顺序类编码,无法确定,奇数为男,偶数为女    y: 校

javascript实现根据身份证号读取相关信息_javascript技巧

公民身份号码由六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码组成. 地址码 前两位表示省,中间两位表示市,后两位表示县 顺序码 表示同一地址码所标识的区域范围内,对同年.月.日出生的人员编定的顺序号.顺序码的奇数分给男性,偶数分给女性. 校验码 是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码. 校验码计算方法:     1)将前面的身份证号码17位数分别乘以不同的系数,从第一位到第十七位的系数分别为:7 9 10 5 8 4 2