探究from表单的身份证号码的校验逻辑 javascript
start
- 最近番茄学习前端八股文,学的有些乏味了。随即在应用商店下载了几个小游戏,准备把玩放松一下。
- 众所周知,现在玩游戏都是要身份证实名认证的,但是我又有精神洁癖,不想把自己的身份证提供给这种小作坊。
- "输入"一个身份证号码?番茄尝试了很多次,但是它的表单校验却一直无法通过。我很好奇!它这校验咋写的,走我们手撕一个去。
目标
- 了解身份证号码的规则
- 编写正则
研究一下身份证号码的格式
- 我们的身份证号码是长度为18的字符串,除了最后一位可能为字母
x
或0-9
数字,其他每一位都由0-9
数字组成。 - 每一位数字的意义:
1、省份
前1、2位数字表示:所在省份的代码。
2、城市
第3、4位数字表示:所在城市的代码。
3、区县
第5、6位数字表示:所在区县的代码。
4、出生日期
第7~14位数字表示:出生年、月、日。
5、顺序码
第15、16、17位数字表示 ,顺序码奇数表示男性,偶数表示女性
6、校检码
第18位数字是校检码:用来检验身份证的正确性。校检码可以是0~10的数字,10用x表示。校验码是根据前面17位数字根据计算规则得出来的数字(具体的计算规则后面会说到)
说句题外话
- 按照上述的规则,一个刚出生孩子,其实他的身份证账号的绝大部分都是固定的。比如省市县,比如出生日期,比如说校验码。
- 又考虑到每个人的身份证号码是唯一的,所以除去出生地的问题,除去性别的问题,所以一个县一天最多只能出生500个男孩或者500个女孩。
- 那假如一个县同一天内出生的男孩/女孩数量超过的500怎么办?那不是身份证号码不唯一了?
有人简略推算过,发生这种情况的概率暂时比较低,如果真的有一天,一个县一天内出生的孩子超过1000,可以人为的将生日往后推迟一天,当然这只是我的猜测。
编写正则
1.简单的身份证校验
var p = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
2.进一步限制
// 校验最基本的位数规则,以及校验`校验码`var checkCode = function (val) {var p = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];var code = val.substring(17);if (p.test(val)) {var sum = 0;for (var i = 0; i < 17; i++) {sum += val[i] * factor[i];}if (parity[sum % 11] == code.toUpperCase()) {return true;}}return false;}// 校验年月日 var checkDate = function (val) {var pattern = /^(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)$/;if (pattern.test(val)) {var year = val.substring(0, 4);var month = val.substring(4, 6);var date = val.substring(6, 8);var date2 = new Date(year + "-" + month + "-" + date);if (date2 && date2.getMonth() == (parseInt(month) - 1)) {return true;}}return false;}// 校验省份编码var checkProv = function (val) {var pattern = /^[1-9][0-9]/;var provs = { 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: "澳门" };if (pattern.test(val)) {if (provs[val]) {return true;}}return false;}var checkID = function (val) {if (checkCode(val)) {var date = val.substring(6, 14);if (checkDate(date)) {if (checkProv(val.substring(0, 2))) {return true;}}}return false;}
校验码生成规则?
// 获取校验码 (这里为了方便演示,就单独把这逻辑抽离出来了,暂不考虑参数的异常情况,建议先正则匹配完基本字段结构再做校验码校验)function getCheckCode(val) {// 加权因子let factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]// 校验码let parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]let sum = 0for (var i = 0; i < 17; i++) {sum += val[i] * factor[i]}// 校验码校验规则: (前17项每一项 * 对应位数的加权因子) 累加,除以11求余,再对应校验码数组的索引。return parity[sum % 11]}console.log('测试数据', getCheckCode('13082119660231557')) //'测试数据' 1
参考文章:
- 身份证号码的正则表达式及验证详解(JavaScript,Regex)
end
- 所以在
研究一下身份证号码的格式
章节截图的身份证账号的校验码应该为1
,相信这样的身份证号码,妥妥的可以通过前端页面校验了。ღ( ´・ᴗ・` ) - 在我生成合格的身份证账号后,打开小作坊的游戏,输入身份证号码,点击提交,它提示我,姓名和身份证账号不一致。。。。。
- o(╥﹏╥)o哭晕在厕所,拜拜了你嘞。不玩了,学前端去。
探究from表单的身份证号码的校验逻辑 javascript相关推荐
- jQuery正则表达式表单验证身份证号码
代码: <!DOCTYPE html> <html><head ><title></title><script src="j ...
- iOS之身份证号码全校验与校验位自动补全
在项目中进行身份证号码的校验,首先有必要了解一下居民身份证的基本构成: 长度必须是18位,前17位必须是数字,第十八位可以是数字或X: 前两位必须是以下情形中的一种:11.12.13.14.15.21 ...
- java中自定义表单和流程_让驰骋工作流程引擎 ccbpm使用自定义表单来实现自己的业务逻辑....
1.1.1.1: SDK表单 概要说明:我们把流程引擎与表单引擎统称为ccbpm,但是有一些用户并不想使用表单引擎,而是用自己的表单,仅仅使用流程引擎,这样的方式就要采用ccbpm的sdk表单开发模式 ...
- Python编程100例--身份证号码的校验码
身份证号码的校验码 任务描述: 身份证号码是由17位数字本体码和1位数字校验码组成,具有特定含义: 前6位是省市县行政区划分代码:第7-14位为出生年月日:第15-17位为登记流水号,其中第17位为偶 ...
- 如何对身份证号码进行校验?
每个人的身份证号码都都是一串有特别意义的数字,如代表出生地,出生日,性别等,那么对于行政上的一些工作,核对身份证是不是输入有误,身份证是否造假,也是可以通过身份证上的号码数字进行核对检查. 先看一下原 ...
- C语言——实验一:查验身份证(身份证号码的校验码)
前言 为什么我这个萌新要来写这篇文章?事情还要从上周三说起. 在上周三的程序设计基础课上,我们老师给我们全班同学布置了一项题为<实验一:查验身份证>的实验作业,这也是我第一次接触到实验作业 ...
- java身份证号码正则表达式校验(含最后一位的校验值规则)
这里是python版本的: https://yanwenjing.blog.csdn.net/article/details/108210623 请仔细阅读注释 点击这里下载判断身份证号码的小工具 身 ...
- python身份证号码正则表达式校验(含最后一位的校验值规则)
这里是java版本的:https://yanwenjing.blog.csdn.net/article/details/76066985 请仔细阅读注释 点击这里下载判断身份证号码的小工具 身份证号码 ...
- el-form表单验证身份证合法性和手机号格式
一.需求:身份证号:根据身份证编码规则在表单输入框添加校验,手机号:验证基本格式. 1.验证form表单身份证合法性和手机号格式,页面效果如下 2.身份证编码规则 排列顺序从左至右依次为:六位数字地址 ...
最新文章
- POJ1690 简单运算去括号
- 自动化设计模式Page Object
- easy admin java_GitHub - zzccbb8/easyadmin: 简易的java后台管理框架,基于SpringBoot+FreeMark+ace admin+mysql...
- php 反射 调用私有方法,PHP通过反射方法调用执行类中的私有方法
- linux telnet远程登录的步骤,Linux如何远程登录telnet和ssh
- 基于区块链技术的数据安全共享网络体系研究_基于区块链技术的用户信息隐私保护与共享方案...
- Bailian3254 约瑟夫问题No.2【模拟】
- 数据库开发基础-教案-3-认识数据库备份和事务日志备份
- 四凯模型火箭发动机参数大全
- python抢票软件 app_收藏!用 Python 写一个抢票软件
- 帝国cms支持php多少,帝国cms支持php吗
- nginx -rtmp多码率,动态码率二级m3u8适应
- 公司自动打卡与考勤作弊
- 笔记:计算机视觉与深度学习-北邮-鲁鹏-2020年录屏-第一讲
- 写给自己——瞎写瞎画坑规(自己挖坑自己填啊!!)
- 光敏二极管血氧仪方案设计研发
- STM 32简单编程实例
- c语言sort函数从小到大排序指针,sort排序是从小到大
- 题解 P1985 【[USACO07OPEN]翻转棋】
- 华米Q3财报超预期,智能穿戴设备接替手机狂奔?
热门文章
- Dijkstra最短路由算法,求任意两点之间的最短距离【Java】
- 2014522420145238《信息安全系统设计基础》实验一 开发环境的熟悉
- 《网络攻防》信息搜集与漏洞扫描
- Excel2019将下面空白单元格填充的和上面值一样
- 校招(含实习生春招)指南
- vue移动端页面调用手机拍照_vue实现PC端调用摄像头拍照、移动端调用手机前置摄像头人脸录入、及图片旋转矫正、压缩上传base64格式/文件格式...
- html表格内容居中且自动换行
- 介绍个人计算机水平,计算机个性自我介绍范文
- win10台式机屏幕亮度无法调节
- android 出生日期设置,android-选择出生日期对话框