start

  • 最近番茄学习前端八股文,学的有些乏味了。随即在应用商店下载了几个小游戏,准备把玩放松一下。
  • 众所周知,现在玩游戏都是要身份证实名认证的,但是我又有精神洁癖,不想把自己的身份证提供给这种小作坊。
  • "输入"一个身份证号码?番茄尝试了很多次,但是它的表单校验却一直无法通过。我很好奇!它这校验咋写的,走我们手撕一个去。

目标

  1. 了解身份证号码的规则
  2. 编写正则

研究一下身份证号码的格式

  1. 我们的身份证号码是长度为18的字符串,除了最后一位可能为字母x0-9数字,其他每一位都由0-9数字组成。
  2. 每一位数字的意义:

    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

参考文章:

  1. 身份证号码的正则表达式及验证详解(JavaScript,Regex)

end

  • 所以在 研究一下身份证号码的格式章节截图的身份证账号的校验码应该为1,相信这样的身份证号码,妥妥的可以通过前端页面校验了。ღ( ´・ᴗ・` )
  • 在我生成合格的身份证账号后,打开小作坊的游戏,输入身份证号码,点击提交,它提示我,姓名和身份证账号不一致。。。。。
  • o(╥﹏╥)o哭晕在厕所,拜拜了你嘞。不玩了,学前端去。

探究from表单的身份证号码的校验逻辑 javascript相关推荐

  1. jQuery正则表达式表单验证身份证号码

    代码: <!DOCTYPE html> <html><head ><title></title><script src="j ...

  2. iOS之身份证号码全校验与校验位自动补全

    在项目中进行身份证号码的校验,首先有必要了解一下居民身份证的基本构成: 长度必须是18位,前17位必须是数字,第十八位可以是数字或X: 前两位必须是以下情形中的一种:11.12.13.14.15.21 ...

  3. java中自定义表单和流程_让驰骋工作流程引擎 ccbpm使用自定义表单来实现自己的业务逻辑....

    1.1.1.1: SDK表单 概要说明:我们把流程引擎与表单引擎统称为ccbpm,但是有一些用户并不想使用表单引擎,而是用自己的表单,仅仅使用流程引擎,这样的方式就要采用ccbpm的sdk表单开发模式 ...

  4. Python编程100例--身份证号码的校验码

    身份证号码的校验码 任务描述: 身份证号码是由17位数字本体码和1位数字校验码组成,具有特定含义: 前6位是省市县行政区划分代码:第7-14位为出生年月日:第15-17位为登记流水号,其中第17位为偶 ...

  5. 如何对身份证号码进行校验?

    每个人的身份证号码都都是一串有特别意义的数字,如代表出生地,出生日,性别等,那么对于行政上的一些工作,核对身份证是不是输入有误,身份证是否造假,也是可以通过身份证上的号码数字进行核对检查. 先看一下原 ...

  6. C语言——实验一:查验身份证(身份证号码的校验码)

    前言 为什么我这个萌新要来写这篇文章?事情还要从上周三说起. 在上周三的程序设计基础课上,我们老师给我们全班同学布置了一项题为<实验一:查验身份证>的实验作业,这也是我第一次接触到实验作业 ...

  7. java身份证号码正则表达式校验(含最后一位的校验值规则)

    这里是python版本的: https://yanwenjing.blog.csdn.net/article/details/108210623 请仔细阅读注释 点击这里下载判断身份证号码的小工具 身 ...

  8. python身份证号码正则表达式校验(含最后一位的校验值规则)

    这里是java版本的:https://yanwenjing.blog.csdn.net/article/details/76066985 请仔细阅读注释 点击这里下载判断身份证号码的小工具 身份证号码 ...

  9. el-form表单验证身份证合法性和手机号格式

    一.需求:身份证号:根据身份证编码规则在表单输入框添加校验,手机号:验证基本格式. 1.验证form表单身份证合法性和手机号格式,页面效果如下 2.身份证编码规则 排列顺序从左至右依次为:六位数字地址 ...

最新文章

  1. POJ1690 简单运算去括号
  2. 自动化设计模式Page Object
  3. easy admin java_GitHub - zzccbb8/easyadmin: 简易的java后台管理框架,基于SpringBoot+FreeMark+ace admin+mysql...
  4. php 反射 调用私有方法,PHP通过反射方法调用执行类中的私有方法
  5. linux telnet远程登录的步骤,Linux如何远程登录telnet和ssh
  6. 基于区块链技术的数据安全共享网络体系研究_基于区块链技术的用户信息隐私保护与共享方案...
  7. Bailian3254 约瑟夫问题No.2【模拟】
  8. 数据库开发基础-教案-3-认识数据库备份和事务日志备份
  9. 四凯模型火箭发动机参数大全
  10. python抢票软件 app_收藏!用 Python 写一个抢票软件
  11. 帝国cms支持php多少,帝国cms支持php吗
  12. nginx -rtmp多码率,动态码率二级m3u8适应
  13. 公司自动打卡与考勤作弊
  14. 笔记:计算机视觉与深度学习-北邮-鲁鹏-2020年录屏-第一讲
  15. 写给自己——瞎写瞎画坑规(自己挖坑自己填啊!!)
  16. 光敏二极管血氧仪方案设计研发
  17. STM 32简单编程实例
  18. c语言sort函数从小到大排序指针,sort排序是从小到大
  19. 题解 P1985 【[USACO07OPEN]翻转棋】
  20. 华米Q3财报超预期,智能穿戴设备接替手机狂奔?

热门文章

  1. Dijkstra最短路由算法,求任意两点之间的最短距离【Java】
  2. 2014522420145238《信息安全系统设计基础》实验一 开发环境的熟悉
  3. 《网络攻防》信息搜集与漏洞扫描
  4. Excel2019将下面空白单元格填充的和上面值一样
  5. 校招(含实习生春招)指南
  6. vue移动端页面调用手机拍照_vue实现PC端调用摄像头拍照、移动端调用手机前置摄像头人脸录入、及图片旋转矫正、压缩上传base64格式/文件格式...
  7. html表格内容居中且自动换行
  8. 介绍个人计算机水平,计算机个性自我介绍范文
  9. win10台式机屏幕亮度无法调节
  10. android 出生日期设置,android-选择出生日期对话框