超精准的javascript验证身份证号的具体实现方法


Posted in Javascript onNovember 18, 2015

编写程序前先来了解下身份证号的构成:

身份证号分为两种,旧的为15位,新的为18位。

身份证15位编码规则:dddddd yymmdd xx p   

其中 dddddd:地区码    yymmdd: 出生年月日    xx: 顺序类编码,无法确定    p: 性别,奇数为男,偶数为女;

身份证18位编码规则:dddddd yyyymmdd xxx y   

其中 dddddd:地区码    yyyymmdd: 出生年月日     xxx:顺序类编码,无法确定,奇数为男,偶数为女    y: 校验码,该位数值可通过前17位计算获得,计算的公式见程序,一些需要用到的常数

18位号码加权因子为(从右到左) Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,1 ]    验证位 Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]    校验位计算公式:Y_P = mod( ∑(Ai×Wi),11 )    

i为身份证号码从右往左数的 2...18 位; Y_P为脚丫校验码所在校验码数组位置。

var Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ]; // 加权因子 
var ValideCode = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ];   // 身份证验证位值.10代表X 
function IdCardValidate(idCard) { 
 idCard = trim(idCard.replace(/ /g, ""));    //去掉字符串头尾空格      
 if (idCard.length == 15) { 
  return isValidityBrithBy15IdCard(idCard);  //进行15位身份证的验证 
 } else if (idCard.length == 18) { 
  var a_idCard = idCard.split("");    // 得到身份证数组 
  if(isValidityBrithBy18IdCard(idCard)&&isTrueValidateCodeBy18IdCard(a_idCard)){ //进行18位身份证的基本验证和第18位的验证
   return true; 
  }else { 
   return false; 
  } 
 } else { 
  return false; 
 } 
} 
/** 
 * 判断身份证号码为18位时最后的验证位是否正确 
 * @param a_idCard 身份证号码数组 
 * @return 
 */ 
function isTrueValidateCodeBy18IdCard(a_idCard) { 
 var sum = 0;        // 声明加权求和变量 
 if (a_idCard[17].toLowerCase() == 'x') { 
  a_idCard[17] = 10;     // 将最后位为x的验证码替换为10方便后续操作 
 } 
 for ( var i = 0; i < 17; i++) { 
  sum += Wi[i] * a_idCard[i];   // 加权求和 
 } 
 valCodePosition = sum % 11;    // 得到验证码所位置 
 if (a_idCard[17] == ValideCode[valCodePosition]) { 
  return true; 
 } else { 
  return false; 
 } 
} 
/** 
 * 验证18位数身份证号码中的生日是否是有效生日 
 * @param idCard 18位书身份证字符串 
 * @return 
 */ 
function isValidityBrithBy18IdCard(idCard18){ 
 var year = idCard18.substring(6,10); 
 var month = idCard18.substring(10,12); 
 var day = idCard18.substring(12,14); 
 var temp_date = new Date(year,parseFloat(month)-1,parseFloat(day)); 
 // 这里用getFullYear()获取年份,避免千年虫问题 
 if(temp_date.getFullYear()!=parseFloat(year) 
   ||temp_date.getMonth()!=parseFloat(month)-1 
   ||temp_date.getDate()!=parseFloat(day)){ 
   return false; 
 }else{ 
  return true; 
 } 
} 
 /** 
 * 验证15位数身份证号码中的生日是否是有效生日 
 * @param idCard15 15位书身份证字符串 
 * @return 
 */ 
 function isValidityBrithBy15IdCard(idCard15){ 
  var year = idCard15.substring(6,8); 
  var month = idCard15.substring(8,10); 
  var day = idCard15.substring(10,12); 
  var temp_date = new Date(year,parseFloat(month)-1,parseFloat(day)); 
  // 对于老身份证中的你年龄则不需考虑千年虫问题而使用getYear()方法 
  if(temp_date.getYear()!=parseFloat(year) 
    ||temp_date.getMonth()!=parseFloat(month)-1 
    ||temp_date.getDate()!=parseFloat(day)){ 
    return false; 
  }else{ 
   return true; 
  } 
 } 
//去掉字符串头尾空格 
function trim(str) { 
 return str.replace(/(^\s*)|(\s*$)/g, ""); 
}

 根据身份证号对其进行性别的判定

/** 
 * 通过身份证判断是男是女 
 * @param idCard 15/18位身份证号码 
 * @return 'female'-女、'male'-男 
 */ 
function maleOrFemalByIdCard(idCard){ 
 idCard = trim(idCard.replace(/ /g, ""));  // 对身份证号码做处理。包括字符间有空格。 
 if(idCard.length==15){ 
  if(idCard.substring(14,15)%2==0){ 
   return 'female'; 
  }else{ 
   return 'male'; 
  } 
 }else if(idCard.length ==18){ 
  if(idCard.substring(14,17)%2==0){ 
   return 'female'; 
  }else{ 
   return 'male'; 
  } 
 }else{ 
  return null; 
 } 
}

以上就是javascript验证身份证号的具体实现方法,并且根据身份证能验证性别,是不是很神奇,欢迎大家学习借鉴。

Javascript 相关文章推荐
jQuery 入门讲解1
Apr 15 Javascript
JS 有趣的eval优化输入验证实例代码
Sep 22 Javascript
原生js ActiveXObject获取execl里面的值
Nov 01 Javascript
Node.js中HTTP模块与事件模块详解
Nov 14 Javascript
jQuery zclip插件实现跨浏览器复制功能
Nov 02 Javascript
基于jQuery实现选取月份插件附源码下载
Dec 28 Javascript
javascript移动开发中touch触摸事件详解
Mar 18 Javascript
获取今天,昨天,本周,上周,本月,上月时间(实例分享)
Jan 04 Javascript
vue生成token保存在客户端localStorage中的方法
Oct 25 Javascript
解析Json字符串的三种方法日常常用
May 02 Javascript
iView框架问题整理小结
Oct 16 Javascript
vue实现登录拦截
Jun 29 Javascript
javascript中checkbox使用方法简单实例演示
Nov 17 #Javascript
javascript下拉列表中显示树形菜单的实现方法
Nov 17 #Javascript
JS封装cookie操作函数实例(设置、读取、删除)
Nov 17 #Javascript
jquery可定制的在线UEditor编辑器
Nov 17 #Javascript
JS实现选项卡实例详解
Nov 17 #Javascript
基于Jquery代码实现支持PC端手机端幻灯片代码
Nov 17 #Javascript
举例说明如何为JavaScript的方法参数设置默认值
Nov 17 #Javascript
You might like
PHP多线程批量采集下载美女图片的实现代码(续)
2013/06/03 PHP
mac下安装nginx和php
2013/11/04 PHP
一个PHP针对数字的加密解密类
2014/03/20 PHP
PHP动态页生成静态页的3种常用方法
2014/11/13 PHP
php+mysql查询实现无限下级分类树输出示例
2016/10/03 PHP
magento后台无法登录解决办法的两种方法
2016/12/09 PHP
PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
2018/04/20 PHP
javascript管中窥豹 形参与实参浅析
2011/12/17 Javascript
基于jquery实现页面滚动时顶部导航显示隐藏
2020/04/20 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
2016/10/10 Javascript
老生常谈原生JS执行环境与作用域
2016/11/22 Javascript
JavaScript实现图像模糊化的方法实例
2017/01/15 Javascript
写jQuery插件时的注意点
2017/02/20 Javascript
React Native开发封装Toast与加载Loading组件示例
2018/09/08 Javascript
jquery获取file表单选择文件的路径、名字、大小、类型
2019/01/18 jQuery
微信小程序 冒泡事件原理解析
2019/09/27 Javascript
Vue中img的src是动态渲染时不显示的解决
2019/11/14 Javascript
vue新建项目并配置标准路由过程解析
2019/12/09 Javascript
Python中logging模块的用法实例
2014/09/29 Python
python计算文本文件行数的方法
2015/07/06 Python
详解 Python 读写XML文件的实例
2017/08/02 Python
Python入门之后再看点什么好?
2018/03/05 Python
python调用摄像头显示图像的实例
2018/08/03 Python
python使用pipeline批量读写redis的方法
2019/02/18 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
2021/01/15 Python
html5使用canvas画三角形
2014/12/15 HTML / CSS
Delphi笔试题
2016/11/14 面试题
秋季运动会加油稿200字
2014/01/11 职场文书
满月酒主持词
2014/03/27 职场文书
党员十八大心得体会
2014/09/12 职场文书
党员群众路线教育实践活动学习笔记
2014/11/05 职场文书
观后感格式
2015/06/19 职场文书
公司老总年会致辞
2015/07/30 职场文书
导游词之介休绵山
2019/12/31 职场文书
SQL Server连接查询的实用教程
2021/04/07 SQL Server
Python基础之tkinter图形化界面学习
2021/04/29 Python