javascript 15位和18位身份证的正则表达式及其验证

1、简单的正则表达式:

 

(1)preg_match("/^(\d{18,18}|\d{15,15}|\d{17,17}x)$/",$id_card)
(2)preg_match("/^(\d{6})(18|19|20)?(\d{2})([01]\d)([0123]\d)(\d{3}) (\d|X)?$/",$id_card)
(3)preg_match("/(^\d{15}$/)|(\d{17}(?:\d|x|X)$/),$id_card)

2、复杂并且严格一些的验证:

//这个可以验证15位和18位的身份证,并且包含生日和校验位的验证。  
//如果有兴趣,还可以加上身份证所在地的验证,就是前6位有些数字合法有些数字不合法。

function isIdCardNo(num)
{  
          num = num.toUpperCase();
         //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。  
          if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num)))  
          {
               alert('输入的身份证号长度不对,或者号码不符合规定!\n15位号码应全为数字,18位号码末位可以为数字或X。');
              return false;
         }
//校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
//下面分别分析出生日期和校验位
var len, re;
len = num.length;
if (len == 15)
{
re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/);
var arrSplit = num.match(re);

//检查生日日期是否正确
var dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4]);
var bGoodDay;
bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
if (!bGoodDay)
{
          alert('输入的身份证号里出生日期不对!');  
           return false;
}
else
{
//将15位身份证转成18位
//校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
          var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
           var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
           var nTemp = 0, i;  
            num = num.substr(0, 6) + '19' + num.substr(6, num.length - 6);
           for(i = 0; i < 17; i ++)
          {
                nTemp += num.substr(i, 1) * arrInt[i];
           }
           num += arrCh[nTemp % 11];  
            return num;  
}  
}
if (len == 18)
{
re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/);
var arrSplit = num.match(re);

//检查生日日期是否正确
var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]);
var bGoodDay;
bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
if (!bGoodDay)
{
alert(dtmBirth.getYear());
alert(arrSplit[2]);
alert('输入的身份证号里出生日期不对!');
return false;
}
else
{
//检验18位身份证的校验码是否正确。
//校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
var valnum;
var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
var nTemp = 0, i;
for(i = 0; i < 17; i ++)
{
nTemp += num.substr(i, 1) * arrInt[i];
}
valnum = arrCh[nTemp % 11];
if (valnum != num.substr(17, 1))
{
alert('18位身份证的校验码不正确!应该为:' + valnum);
return false;
}
return num;
}
}
return false;
}
3、严格的验证:
<script>
var aCity={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:"新Unbsp;疆",71:"台湾",81:"香港",82:"澳门",91:"国外 "}

function cidInfo(sId){
var iSum=0
var info=""
if(!/^d{17}(d|x)$/i.test(sId))return false;
sId=sId.replace(/x$/i,"a");
if(aCity[parseInt(sId.substr(0,2))]==null)return "Error:非法地区";
sBirthday=sId.substr(6,4)+"-"+Number(sId.substr(10,2))+"-"+Number(sId.substr(12,2));
var d=new Date(sBirthday.replace(/-/g,"/"))
if(sBirthday!=(d.getFullYear()+"-"+ (d.getMonth()+1) + "-" + d.getDate()))return "Error:非法生日";
for(var i = 17;i>=0;i --) iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 - i),11)
if(iSum%11!=1)return "Error:非法证号";
return aCity[parseInt(sId.substr(0,2))]+","+sBirthday+","+(sId.substr(16,1)%2?" 男":"女")
}
document.write(cidInfo("380524198002300016"),"<br/>");
document.write(cidInfo("340524198002300019"),"<br/>")
document.write(cidInfo("340524197711111111"),"<br/>")
document.write(cidInfo("34052419800101001x"),"<br/>");
</script>

转载于:https://www.cnblogs.com/devinhua/articles/1726292.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EasyUI_datagrid

案例一丶jquery.easyui.min.js:10631 Uncaught TypeError: this.renderEmptyRow is not a function 解决方法&#xff1a;datagrid记录为空就会报错。是easyui里没处理return 空的方法。需要进行添加一些东西。具体我也不清楚&#xff0c; 案例二丶清除datagrid右侧空白区域 查…

三枚硬币自制收音机

大家好&#xff0c;我是记得诚。我们称这个收音机为三个硬币收音机是因为我们使用了三个硬币作为锚点&#xff0c;连接收音机各个部件&#xff0c;这将使我们的制作过程变得极为简单。在这个收音机中我们使用了一个特殊的10晶体管集成电路&#xff0c;使最后做出的收音机效果非…

clickhouse 增量更新_ClickHouse王炸功能即将来袭?

众所周知&#xff0c;MySQL 的用户群体很大&#xff0c;为了能够增强数据的实时性&#xff0c;很多解决方案会利用 binlog 将数据写入到 ClickHouse。为了能够监听 binlog 事件&#xff0c;我们需要用到类似 canal 这样的第三方中间件&#xff0c;这无疑增加了系统的复杂度。在…

在批处理文件中启动MediaPlayer播放制定文件

我们知道在运行可以使用wmplayer指令来启动一个MediaPlayer&#xff0c;如果需要让MediaPlayer播放制定的文件或是一个制定的流媒体发布点&#xff0c;我们可以使用如下的命令格式wmplayer “mms://WIN-FW.MiGu.com/12530″wmplayer “C:\wmpub\wmroot\legacy_content_clip.wmv…

双重检查锁实现单例模式的线程安全问题

一、结论 双重校验锁的单例模式代码如下&#xff1a; public class Singleton {   private static Singleton singleton; private Singleton() {} public static Singleton getSingleton() {     if (singleton null) { // 1       synchronized (Singleton.clas…

摇杆控制方向原理_为工业安全守好”门”!各种方向的控制阀原理图大集合

单向的、换向的....你想了解的方向控制阀都在这里了&#xff01;方向控制阀门液压阀是用来控制液压系统中油液的流动方向或调节其流量和压力的。方向控制阀作为液压阀的一种&#xff0c;利用流道的更换控制着油液的流动方向。单向型方向控制阀是只允许气流沿一个方向流动的方向…

对于新生代农民工,你有什么想说的?

昨晚上这个新闻很多人转&#xff0c;但是可能很少有人知道他的链接出处&#xff0c;链接来自于http://www.mohrss.gov.cn/SYrlzyhshbzb/jiuye/gzdt/202108/t20210816_420736.html我记得我还在上小学的时候&#xff0c;我们家有干不完的农活&#xff0c;暑假每天都要下田干活&am…

谁是经营之神

—北京维富友携手北京服装学院开展服装ERP沙盘大赛时间4月21日&#xff0c;地点北京服装学院&#xff0c;参加人数35人&#xff0c;参加人员北京维富友软件公司高级讲师、服装学院教师和同学共35人。目的&#xff1a;为了让学生更好的掌握服装企业管理和盈利管控&#xff0c;北…

在Android初次的前期学习中的二个小例子(2)

Hello13:SQLite数据库 一、简述SQLite的概念和主要特性SQLite是一个轻量级的关系型数据库&#xff0c;运算速度快&#xff0c;占用资源少&#xff0c;使用非常方便&#xff0c;支持SQL语法标准和数据库事务原则。相对于SharedPreferences使用文件保存数据&#xff0c;SQLite具有…

access 增加字段 工具_Java效率工具之Lombok

作者&#xff1a;LiWenD正在掘金来源&#xff1a;https://juejin.im/post/5b00517cf265da0ba0636d4b上一篇&#xff1a;数据库查询速度优化之解决技巧还在编写无聊枯燥又难以维护的POJO吗&#xff1f;洁癖者的春天在哪里&#xff1f;请看Lombok&#xff01;在过往的Java项目中&…

一文读懂 | 进程并发与同步

并发 是指在某一时间段内能够处理多个任务的能力&#xff0c;而 并行 是指同一时间能够处理多个任务的能力。并发和并行看起来很像&#xff0c;但实际上是有区别的&#xff0c;如下图&#xff08;图片来源于网络&#xff09;&#xff1a;concurrency-parallelism上图的意思是&a…

快速完成和读懂测试计划

每个项目测试计划都会不一样&#xff0c;但是一般情况下&#xff0c;每个公司都会有相应的模板&#xff0c;尤其是项目很频繁的公司&#xff0c;相对应的模板应该就更全面&#xff0c;并且更容易修改&#xff0c;更能适应新项目。 并且&#xff0c;经常接触测试计划的人可能会察…

rust卡领地柜权限_RFID智能医疗耗材柜,上海智能高值耗材柜,国药智能医用耗材柜...

近几年因为我们的医疗改革一直在进步并改革&#xff0c;国家对我们的医疗方面的补助也有了明显的加大投入&#xff0c;与此同时让各种公立私立医院如雨后春笋般层出不穷&#xff0c;各大医院为了在医疗市场占有一席之地&#xff0c;都在各个方面开始想办法提升自己医院的水准。…

刚接触电子时,有过哪些百思不得其解的问题?

青少年时期&#xff0c;刚接触电子时&#xff0c;出于好奇&#xff0c;对这方面的东西也比较关注&#xff0c;但同时也衍生了一些百思不得其解的疑问&#xff0c;比如...01物理书里说大地是导体&#xff0c;那为什么我的小灯珠却不亮&#xff01;&#xff1f;02初三时学了物理的…

建立管理SQL Server登录帐户

1、打开SQL Server 2005的管理工具&#xff0c;选择以windows身份验证模式登陆。然后右击服务器选择属性。2、在打开的服务器属性页面中&#xff0c;选择“安全性”做如下图设置&#xff1a;3.在windows上新建三个组:ReceptionEmployees&#xff0c;ITEmployees。4、然后在SQL …

属性

属性 属性的作用就是保护字段、对字段的赋值和取值进行限定。 属性的本质就是两个方法&#xff0c;一个叫get()一个叫set()。 既有get()也有set()我们诚之为可读可写属性。 只有get()没有set()我们称之为只读属性 没有get()只有set()我们称之为只写属性 private char _gender; …

c++ doxygen 注释规范_利用Doxygen给C程序生成注释文档

利用Doxygen为C程序生成注释文档一、Doxygen工具的安装利用Doxygen工具生成API帮助文档需要下载安装以下三个软件&#xff1a;(1)Doxygen&#xff1a;可以从一套归档源文件开始&#xff0c;生成HTML格式的在线类浏览器&#xff0c;或离线的LATEX、RTF参考手册。本文中所使用的版…

【2021新版】一线大厂 Go 面试题合集

秋天到了&#xff0c;又到了工程师们躁动不安&#xff0c;蠢蠢欲动的季节~这不&#xff0c;金九银十已然到了家门口&#xff0c;现在后台就有不少人问我&#xff1a;现在外边大厂面试都问啥想去大厂又怕面试挂面试应该怎么准备Go 开发前景如何啥样的后端适合切 Go 技术栈...面试…

python开发【基础二】

基本数据类型&#xff1a; 1、数字 在Python2中&#xff0c;分为整形(int)和长整形(long)。 在Python3中&#xff0c;都是int。 #1、将字符串转换为数字 a "123" v int(a) print(v) print(type(v))#2、当前数字的二进制&#xff0c;至少用几位表示 1位等于8个字节.…

微软白皮书发布:在IIS7.5中用Service Bus端点寄宿WCF服务

公告&#xff1a;本博客为微软云计算中文博客的镜像博客。部分文章因为博客兼容性问题&#xff0c;会影响阅读体验。如遇此情况&#xff0c;请访问原博客。 针对如何在IIS中寄宿Service Bus的问题&#xff0c;微软官方提供了白皮书详细介绍了解决方案。有兴趣的读者可以从下面的…