身份证验证思路及代码
Posted zhaodesheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了身份证验证思路及代码相关的知识,希望对你有一定的参考价值。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <pre> 1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ; 2、将这17位数字和系数相乘的结果相加; 3、用加出来和除以11,看余数是多少; 4、余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2; 5、通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的X。 例如:某男性的身份证号码是34052419800101001X。我们要看看这个身份证是不是合法的身份证。 首先:我们计算3*7+4*9+0*10+5*5+...+1*2,前17位的乘积和是189 然后:用189除以11得出的结果是商17余2 最后:通过对应规则就可以知道余数2对应的数字是x。所以,这是一个合格的 </pre> <!--35 89 01 80 69 72 41 7--> <input type="text" value=‘34052419800101001X‘ /> <button onclick="check()">校验</button> <script type="text/javascript"> var oInput = document.getElementsByTagName("input")[0]; var coefficient = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; // 系数数组 var checkArr = [1, 0, "X", 9, 8, 7, 6, 5, 4, 3, 2]; // 校验数组 var year, month, day; function check(){ var val = oInput.value; if(val && val.length == 18){ var lastBitCheck = checkNum(sumIdCard(val.slice(0,17)), val.slice(-1)); // 末位校验 year = val.slice(6,10); month = val.slice(10, 12); day = val.slice(12, 14); var yearCheck = checkYear(year); var monthCheck = checkMonth(month); var dayCheck = checkDay(year, month, day); switch(false){ case lastBitCheck: console.log("末位校验失败"); break; case yearCheck: console.log("出生年份校验失败"); break; case monthCheck: console.log("出生月份校验失败"); break; case dayCheck: console.log("出生日期校验失败"); break; default:; } var res = lastBitCheck && yearCheck && monthCheck && dayCheck; // console.log(year, month, day); console.log("校验结果", res); return res; }else{ // console.log("长度有误"); return false; } } function doubleNum (n){ if(n === undefined || n === null){ return ""; } n = String(n); if(n.length > 2){ return n }else{ n = "0" + n; return n.slice(-2); } } function sumIdCard(str){ // 传入IMEI的前14位 var res = 0, tempNum, tempStr; for(let i = 0, len = str.length; i < len; i++){ res += Number(str[i]) * coefficient[i]; } // console.log(res); return res; } function checkNum(num, t){ // 校验位校验 num:sumIdCard的结果,t:idCard的最后一位校验位 // console.log(num, t) var rightTestNum = checkArr[num % 11]; console.log("正确的校验位", rightTestNum); if(String(rightTestNum).toUpperCase() == String(t).toUpperCase()){ return true; }else{ return false; } } function checkYear(year){ year = Number(year); return (year >= 1800 && year <= new Date().getFullYear()) ? true : false; } function checkMonth(month){ month = Number(month); return (month >= 1 && month <= 12) ? true : false; } function checkDay(year, month, day){ year = Number(year); month = Number(month); day = Number(day); var d31 = [1, 3, 5, 7, 8, 10, 12]; // 31天的月份 var d30 = [4, 6, 9, 11]; // 30天的月份 if(d31.indexOf(month) != -1){ return (day >= 1 && day <= 31) ? true : false; }else if(d30.indexOf(month) != -1){ return (day >= 1 && day <= 30) ? true : false; }else if(month == 2){ if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){ return (day >= 1 && day <= 29) ? true : false; }else{ return (day >= 1 && day <= 28) ? true : false; } }else{ // console.error(month,"月份错了(1-12)") return false; } } </script> </body> </html>
以上是关于身份证验证思路及代码的主要内容,如果未能解决你的问题,请参考以下文章
Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段