最近项目在做身份证实名认证,需要校验身份证号码是否正确。找个些工具方法,这里保存记录下。

var vcity={ 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:"国外"  
        };

function checkCard(card)  
{  
  //是否为空  
 if(card === '')  
 {  
     alert('请输入身份证号,身份证号不能为空');  
     document.getElementById('identity').focus;  
     return false;  
 }  
 //校验长度,类型  
 if(isCardNo(card) === false)  
 {  
     alert('您输入的身份证号码不正确,请重新输入');  
     document.getElementById('identity').focus;  
     return false;  
 }  
 //检查省份  
 if(checkProvince(card) === false)  
 {  
     alert('您输入的身份证号码不正确,请重新输入');  
     document.getElementById('identity').focus;  
     return false;  
 }  
 //校验生日  
 if(checkBirthday(card) === false)  
 {  
     alert('您输入的身份证号码生日不正确,请重新输入');  
     document.getElementById('identity').focus();  
     return false;  
 }  
 //检验位的检测  
 if(checkParity(card) === false)  
 {  
     alert('您的身份证校验位不正确,请重新输入');  
     document.getElementById('identity').focus();  
     return false;  
 }  
  return true;  
};

//检查号码是否符合规范,包括长度,类型  
function isCardNo(card)  
{  
 //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X  
 var reg = /(^\d{15}$)|(^\d{17}(\d|X)$)/;  
 if(reg.test(card) === false)  
 {  
     return false;  
 }

return true;  
};

//取身份证前两位,校验省份  
function checkProvince (card)  
{  
 var province = card.substr(0,2);  
 if(vcity[province] == undefined)  
 {  
     return false;  
 }  
 return true;  
};

//检查生日是否正确  
function checkBirthday(card)  
{  
 var len = card.length;  
 //身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字  
 if(len == '15')  
 {  
     var re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/;   
     var arr_data = card.match(re_fifteen);  
     var year = arr_data[2];  
     var month = arr_data[3];  
     var day = arr_data[4];  
     var birthday = new Date('19'+year+'/'+month+'/'+day);  
     return verifyBirthday('19'+year,month,day,birthday);  
 }  
 //身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X  
 if(len == '18')  
 {  
     var re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/;  
     var arr_data = card.match(re_eighteen);  
     var year = arr_data[2];  
     var month = arr_data[3];  
     var day = arr_data[4];  
     var birthday = new Date(year+'/'+month+'/'+day);  
     return verifyBirthday(year,month,day,birthday);  
 }  
 return false;  
};

//校验日期  
function verifyBirthday(year,month,day,birthday)  
{  
 var now = new Date();  
 var now_year = now.getFullYear();  
 //年月日是否合理  
 if(birthday.getFullYear() == year && (birthday.getMonth() + 1) == month && birthday.getDate() == day)  
 {  
     //判断年份的范围(3岁到100岁之间)  
     var time = now_year - year;  
     if(time >= 3 && time <= 100)  
     {  
         return true;  
     }  
     return false;  
 }  
 return false;  
};

//校验位的检测  
function checkParity (card)  
{  
 //15位转18位  
 card = changeFivteenToEighteen(card);  
 var len = card.length;  
 if(len == '18')  
 {  
     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 cardTemp = 0, i, valnum;   
     for(i = 0; i < 17; i ++)   
     {   
         cardTemp += card.substr(i, 1) * arrInt[i];   
     }   
     valnum = arrCh[cardTemp % 11];   
     if (valnum == card.substr(17, 1))   
     {  
         return true;  
     }  
     return false;  
 }  
 return false;  
};

//15位转18位身份证号  
function changeFivteenToEighteen(card)  
{  
 if(card.length == '15')  
 {  
     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 cardTemp = 0, i;     
     card = card.substr(0, 6) + '19' + card.substr(6, card.length - 6);  
     for(i = 0; i < 17; i ++)   
     {   
         cardTemp += card.substr(i, 1) * arrInt[i];   
     }   
     card += arrCh[cardTemp % 11];   
     return card;  
 }  
 return card;  
};

//测试

调用的时候把身份证号码传进来就可以了。

checkCard("4556454512");

身份证号码检验 js相关推荐

  1. 前端身份证号码校验js代码

    今天把项目前端的身份证号码从最初的只是校验长度改为只允许正规的号码,具体内容如下 功能主要校验  年月日 地址  格式  以及最后一位的校验 var code="123132132121&q ...

  2. Java身份证号码严格验证(第18位校验码算法实现)

    /*** 身份证号码的格式:610821-20061222-612-X 由18位数字组成:前6位为地址码,第7至14位为出生日期码,第15至17位为顺序码,* 第18位为校验码.检验码分别是0-10共 ...

  3. JS(JavaScript)验证身份证号码格式的合法性

    一.JS(JavaScript)验证身份证号码格式的合法性,前端工程师会用到JavaScript验证身份证号码是否合法,这里分享一段本人多年以前多写的JavaScript验证输入身份证号码合法性的代码 ...

  4. js 验证身份证号码正确性

    今天找半天js验证身份证的,从网上找了很多,自己也总结了一下,在此记录,以便以后使用查询方便,也供大家参考. 代码如下,可直接用 function isIdCardNo(num) { num = nu ...

  5. JS准确判断身份证号码

    JS准确判断身份证号码 附带示意图 以及使用方法 //校验年月日专用isDate8(sDate) {if (!/^[0-9]{8}$/.test(sDate)) {return false;}var ...

  6. JS正则表达式验证身份证号码

    function isCardNo(card) { // 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X var reg = /(^\d{1 ...

  7. js根据身份证号码判断性别和年龄

    /**这是一个超实用的用js根据身份证号码判断性别男女的特效代码,详细看下面的*/ /** 根据身份证号码判断性别 15位身份证号码:第7.8位为出生年份(两位数),第9.10位为出生月份,第11.1 ...

  8. js 验证身份证号码

    idCard.js部分******************************************************* //******************************* ...

  9. js身份证号码,电话号码验证

    这是jsp页面调用下面的js代码的一段脚本(整理收集的资料) <script type="text/javascript"> function verfiy(){ va ...

  10. EXCEL中如何提取身份证出生日期和性别信息以及检验身份证号码的正确性

    中国居民身份证号码是一组特征组合码,原为15位,现升级为18位,其编码规则为: 15位:6位数字常住户口所在县市的行政区划代码,6位数字出生日期代码,3位数字顺序码. 18位:6位数字常住户口所在县市 ...

最新文章

  1. 碾压专业机构,27 岁华裔小伙推出美国最准新冠预测模型
  2. linux中top工具,Linux命令工具 top详解
  3. LeetCode 406. Queue Reconstruction by Height
  4. 阿里资深技术专家崮德:8 个影响我职业生涯的重要技能
  5. linux定时重启命令
  6. 【ZOJ】3380 Patchouli's Spell Cards
  7. opencart插件之 Also Bought Products(购买该产品的用户也购买了)
  8. thinkphp使用paypal进行支付的做法详细步骤
  9. magicbook linux系统换w7,荣耀 MagicBook U盘装系统win7教程
  10. 计算机设置ip后提示未识别网络连接,win10设置正确的静态IP,但电脑显示未识别网络,怎么回事。求大佬们帮助啊...
  11. 物流行业专业词汇汇总
  12. 自开发数据可视化平台
  13. 企业如何实现在线客服功能?
  14. 获取SYSTEM Shell:Citrix Workspace软件命名管道校验客户端漏洞分析
  15. python画图网格线设置_PyPlot设置 plot的网格线间距_matplotlib_酷徒编程知识库
  16. 80老翁谈人生(347):老翁因火星人失窃源代码与方正结成“死结“
  17. vue3 子组件上绑定(v-model=“xx“) 父组件传过来的值后报错
  18. 无监控、不运维。运维系统架构设计附带思维导图
  19. Mybatis Plus使用,条件拼装、自定义分页、多数据源
  20. 火星人敏捷开发手册免费培训 By 火星人陈勇

热门文章

  1. 接口可维可测;统一管理
  2. 基于SSM+Vue+OSS的“依伴汉服”商城设计与开发(含源码+论文+ppt+数据库)
  3. Power bi_商品销售案例分析
  4. yeahnet邮箱服务器,网易126/163/Yeah.net免费邮箱开放IMAP服务
  5. unexpected indent解决方法
  6. linux恢复,Linux 5.13还原及修复明尼苏达大学的问题补丁
  7. Spring Bean生命周期(简单易懂)
  8. 计算机的音量打不开,电脑没声音。音量控制也打不开怎么处理?
  9. 计算机睡眠和休眠的区别win10,win10睡眠和休眠有何不同_win10休眠和睡眠的区别...
  10. 开源中国众包第三波阿里云悬赏项目,总金额 6 万