javascript验证身份证

身份证规则

根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。

1.将前面的身份证号码17位数分别乘以不同的系数。身份证号码第i位对应的系数为[2^(18-i)] mod 11(此处^代表指数运算)。

2.将这17位数字和系数相乘的结果相加

3.用加出来和除以11,得出余数y。

4.校验码为(12 - y) mod 11 若此结果为10,则以小写字母x代替。

问题分析

依据身份证号码规则,可以初步获知合法的身份证号所遵循的规则。

身份证号是按号码位划分意义,排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

因此,我们要判断身份证号是否符合意义,目前需要对四个数据进行分析:

1、身份证号码是否存在非数字且非x的符号,长度是否为18位等基础身份证号码校验;

2、身份证号码校验位合法校验;

3、数字地址码合法性校验;

4、出生日期码合法性校验。

初步设计

设计四个函数,分别解决问题分析之中的四个问题。

身份证号码基本校验

仅仅是检测参与组成身份证号码的字符是否合法以及长度是否合法。

///<summary>
///身份证号码组成字符合法性验证
///<prarm name="pid">身份证号码</param>
///<return>身份证是否合法</return>
///</summary>
function check_letter_legal (pid) {
    //将pid全部小写
    pid = pid.toLowerCase();
    //获取pid长度
    var length = pid.length;
    //当长度不为18时返回错误
    if(length != 18) return false;
    //遍历pid数组,用于判断是否存在不合法字符
    for(var char_loop_pointer = 0; char_loop_pointer < length; char_loop_pointer++)
        //当存在不合法字符时,即返回错误
        if(('0' > pid[char_loop_pointer] || pid[char_loop_pointer] > '9') && (char_loop_pointer != 17 || pid[char_loop_pointer] != 'x'))
            return false;
    //全部通过后即返回正确
    return true;
}

校验位合法性验证

依据下述法则进行验证:

1.将前面的身份证号码17位数分别乘以不同的系数。身份证号码第i位对应的系数为[2^(18-i)] mod 11(此处^代表指数运算)。

2.将这17位数字和系数相乘的结果相加

3.用加出来和除以11,得出余数y。

4.校验码为(12 - y) mod 11 若此结果为10,则以小写字母x代替。

///<summary>
///身份证号码校验位合法性验证
///<param name="pid">身份证号码</param>
///<return>身份证验证是否合法</return>
///</summary>
function check_parity_bit_legal (pid) {
    //将pid全部小写
    pid = pid.toLowerCase();
    //校验位
    var parity_bit;
    if(pid[17] == undefined) return false
    else if(pid[17] == 'x') parity_bit = 10;
    else parity_bit = parseInt(pid[17]);
    //校验数组
    var check_bit_array = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
    //相乘和存储器
    var sum = 0;
    for(var add_loop = 0; add_loop < 17; add_loop++){
        sum += check_bit_array[add_loop] * parseInt(pid[add_loop]);
    };
    //获得余数
    var remainder = sum % 11;
    //判断校验位合法性
    if(parity_bit == (12 - remainder) % 11) return true;
    else return false;
}

数字地址码合法性校验

目前仅仅检测省份码(因为加县市是在太多了T T)

///<summary>
///地址码合法性验证
///<param name="pid">身份证号码</param>
///<return>身份证验证是否合法</return>
///</summary>
function check_address_code_legal (pid) {
	//省份码
	var province_code={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:"国外"};
	//返回省份码并验证
	var pid_province_code = pid.substring(0, 2);
	if(province_code[pid_province_code] == undefined) return false;
	else return true;
}

出生日期码合法性校验

主要是润平年的问题,以及月份问题

///<summary>
///生日码合法性验证
///<param name="pid">身份证号码</param>
///<return>身份证是否合法</return>
///</summary>
function check_birthday_code_legal (pid) {
	//获取生日
	var year = pid.substring(6, 10);
	var month = pid.substring(10, 12);
	var day = pid.substring(12, 14);

	var month_array = {1: 31, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31};

	//当为2月时判断是否为闰年
	if(month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)) return day <= 29
	else return day <= month_array[month];
}
时间: 2024-10-08 20:50:20

javascript验证身份证的相关文章

JavaScript验证身份证号

<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

javascript 验证身份证

1 /*身份证号码检索*/ 2 function cardCheck(cartNo) { 3 if (cartNo.val() === "") { 4 return false; 5 } 6 else if (cartNo.val().substring(0, 1) === " " || cartNo.val().substring(cartNo.val().length - 1, cartNo.val().length) === " ") {

常用的JavaScript验证正则表达式

常用的JavaScript验证正则表达式 匹配中文字符的正则表达式: [u4e00-u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^x00-xff] 评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 匹配空白行的正则表达式:ns*r 评注:可以用来删除空白行 匹配HTML标记的正则表达式:< (S*?)[^>]*>.*?|< .*? /> 评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分

javascript验证

/* 1.是否以某字符串结尾 endsWith(theStr,endStr) @param theStr:要判断的字符串 @param endStr:以此字符串结尾 @return boolean; */ function endsWith(theStr,endStr) { var theStrLength=theStr.length; var endStrLength=endStr.length; var theStrEnd=theStr.substring(theStrLength-endS

纯javascript验证,100行超精简代码。

这篇文章转自--寒飞,原帖地址http://blog.csdn.net/luoyehanfei/article/details/42262249 QQ交流群235032949 纯javascript验证库详解 还是坚持一贯的原则,编写任何一个插件的时候不引用其它框架.这样做的好处与坏处. 好处:耦合度降低,提升自我编码水平,总有一天你就能成为编写框架的大神. 坏处:琐碎,耗时一点. javascript的验证网上铺天盖地很多,jquery.validate.js也是非常强大的.为什么还要重复造轮

JavaScript验证正则表达式大全

JavaScript验证正则表达式大全,搜集最全的JavaScript验证正则表达式,开始查看吧,这里的都是正则表达式的例子,具体和函数结合的使用方法,还请查看下篇文章<JavaScript使用正则表达式进行验证> 匹配中文字符的正则表达式: [u4e00-u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^x00-xff] 评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 匹配空白行的正则表达式:ns*r 评注

JavaScript验证邮箱的正则表达式

用JavaScript验证邮箱的正则表达式时,一般比较常用的是用以下两种: var pattern = /^([a-zA-Z0-9_-])[email protected]([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/; var pattern = ^\w+[-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$; 但是有时也会碰到像这种邮件:[email protected] 格式的邮件,这样便验证不了了.其实只要将第一个稍微改一下便可以了: va

C# 验证身份证是否合法的函数

主要是验证身份证的开头和身份证的格式和长度是否正确,没有按照身份证的编码规则进行严格验证 /// <summary> /// 验证身份证是否合法 /// </summary> /// <param name="idCard">要验证的身份证</param> public static bool IsIdCard(string idCard) { //如果为空,认为验证合格 if (IsNullOrEmpty(idCard)) { retu

Eclipse去除JavaScript验证错误

这篇文章主要是对Eclipse去除js(JavaScript)验证错误进行了介绍.在Eclipse中,js文件常常会报错.可以通过如下几个步骤解决 第一步: 去除eclipse的JS验证: 将windows->preference->Java Script->Validator->Errors/Warnings-> Enable Javascript Sematic validation前面的勾去掉; 第二步: 右键项目 -> properties -> Buil