侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

JavaScript正则表达式验证身份证号码是否合法(两种方法)

前端  /  管理员 发布于 4年前   269

第一种方法:

在用户注册页面有些需求要求的比较严格,需要对身份证js验证是否合法,通过此功能严格此系统软件,从而过滤到很多水客。下面就此实现方法给大家讲解下。

  很多时候我们都是通过一组正则表达式来判断用户输入的身份证是否合法,那在用正则表达式判断之前,你对身份证号的组成有多少了解呢?下面来说说一个身份证号里面包含了多少的信息:

  1、号码的结构

    公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

  2、地址码(前六位数)

    表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按gb/T2260的规定执行。

  3、出生日期码(第七位至十四位)

    表示编码对象出生的年、月、日,按gb/T7408的规定执行,年、月、日代码之间不用分隔符。

  4、顺序码(第十五位至十七位)

    表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。

  5、校验码(第十八位数)

    作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么 此人的身份证就变成了19位。X是罗马数字的10,用X来代替10,可以保证公民的身份证符合国家标准。

  在知道身份证号结构组成各部分的意思后,我们开始进入主题:

  1、定义一个全国地区的对象

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:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}

  2、正则表达式判断

function isCardID(sId){ var iSum=0 ; var info="" ; if(!/^\d{17}(\d|x)$/i.test(sId)) return "你输入的身份证长度或格式错误"; sId=sId.replace(/x$/i,"a"); if(aCity[parseInt(sId.substr(0,2))]==null) return "你的身份证地区非法"; 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 "身份证上的出生日期非法"; for(var i = 17;i>=0;i --) iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 - i),11) ; if(iSum%11!=1) return "你输入的身份证号非法"; //aCity[parseInt(sId.substr(0,2))]+","+sBirthday+","+(sId.substr(16,1)%2?"男":"女");//此次还可以判断出输入的身份证号的人性别 return true;}

第二种方法:

function scCard(){  var scType=document.getElementById("sc_card_type").value;  if(scType=="1"){   var scCard=document.getElementById("sc_card_num").value;       if(scCard.length!=0){       if(!checkCard(scCard)){       $("#errorTips").html("身份证号码格式错误");       }else{       $("#errorTips").html("");       }       }  }  return false;  }  //function checkidno(obj) {   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:"国外"    };  checkCard = function(obj)  {   //var card = document.getElementById('card_no').value;   //是否为空   // if(card === '')   // {   //  return false;   //}   //校验长度,类型   if(isCardNo(obj) === false)   {    return false;   }   //检查省份   if(checkProvince(obj) === false)   {    return false;   }   //校验生日   if(checkBirthday(obj) === false)   {    return false;   }   //检验位的检测   if(checkParity(obj) === false)   {    return false;   }   return true;  };  //检查号码是否符合规范,包括长度,类型  isCardNo = function(obj)  {   //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X   var reg = /(^\d{15}$)|(^\d{17}(\d|X)$)/;   if(reg.test(obj) === false)   {    return false;   }   return true;  };  //取身份证前两位,校验省份  checkProvince = function(obj)  {   var province = obj.substr(0,2);   if(vcity[province] == undefined)   {    return false;   }   return true;  };  //检查生日是否正确  checkBirthday = function(obj)  {   var len = obj.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 = obj.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 = obj.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;  };  //校验日期  verifyBirthday = function(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 >= 0 && time <= 130)    {     return true;    }    return false;   }   return false;  };  //校验位的检测  checkParity = function(obj)  {   //15位转18位   obj = changeFivteenToEighteen(obj);   var len = obj.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 += obj.substr(i, 1) * arrInt[i];    }    valnum = arrCh[cardTemp % 11];    if (valnum == obj.substr(17, 1))    {     return true;    }    return false;   }   return false;  };  //15位转18位身份证号  changeFivteenToEighteen = function(obj)  {   if(obj.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;     obj = obj.substr(0, 6) + '19' + obj.substr(6, obj.length - 6);    for(i = 0; i < 17; i ++)    {     cardTemp += obj.substr(i, 1) * arrInt[i];    }    obj += arrCh[cardTemp % 11];    return obj;   }   return obj;  };


  • 上一条:
    kkpager 实现ajax分页查询功能
    下一条:
    Ajax 实现网站劫持的检测方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 使用 Alpine.js 排序插件对元素进行排序(0个评论)
    • 在js中使用jszip + file-saver实现批量下载OSS文件功能示例(0个评论)
    • 在vue中实现父页面按钮显示子组件中的el-dialog效果(0个评论)
    • 使用mock-server实现模拟接口对接流程步骤(0个评论)
    • vue项目打包程序实现把项目打包成一个exe可执行程序(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-03
    • 2018-04
    • 2018-05
    • 2018-06
    • 2018-09
    • 2018-11
    • 2018-12
    • 2019-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-04
    • 2021-05
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客