身份证号js简单验证 .
2012-05-10 13:35
246 查看
在做项目时遇到了一个身份证号验证的问题,在网上搜到一个简单的验证身份证格式的js代码,遂转了过来,以备不时之需。
//身份证号码校验,并从中拆分出出生年月日和性别
var yyyy;
var mm;
var dd;
var birthday;
var sex;
function getYear(){
return yyyy;
}
function getMonth(){
return mm;
}
function getDate(){
return dd;
}
function getBirthday(){
return birthday;
}
function getSex(){
return sex;
}
function getAge(){
var mm=getMonth();
if (mm<10)
mm=mm.substring(1,2);
return Math.floor((parseInt(_getYear())*12+parseInt(_getMonth())-parseInt(getYear())*12-parseInt(mm))/12);
}
//判断是否大龄,男50,女40
function isBigAge(){
if (parseInt(getAge())>=40 && parseInt(getSex())==2)
return "1";
if (parseInt(getAge())>=50 && parseInt(getSex())==1)
return "1";
return "0";
}
//校验身份证号码
function CheckValue(idCard){
var id=idCard;
var id_length=id.length;
if (id_length==0){
alert("请输入身份证号码!");
return false;
}
if (id_length!=15 && id_length!=18){
alert("身份证号长度应为15位或18位!");
return false;
}
if (id_length==15){
yyyy="19"+id.substring(6,8);
mm=id.substring(8,10);
dd=id.substring(10,12);
if (mm>12 || mm<=0){
alert("输入身份证号,月份非法!");
return false;
}
if (dd>31 || dd<=0){
alert("输入身份证号,日期非法!");
return false;
}
birthday=yyyy+ "-" +mm+ "-" +dd;
if ("13579".indexOf(id.substring(14,15))!=-1){
sex="1";
}else{
sex="2";
}
}else if (id_length==18){
if (id.indexOf("X") > 0 && id.indexOf("X")!=17 || id.indexOf("x")>0 && id.indexOf("x")!=17){
alert("身份证中"X"输入位置不正确!");
return false;
}
yyyy=id.substring(6,10);
if (yyyy>2200 || yyyy<1900){
alert("输入身份证号,年度非法!");
return false;
}
mm=id.substring(10,12);
if (mm>12 || mm<=0){
alert("输入身份证号,月份非法!");
return false;
}
dd=id.substring(12,14);
if (dd>31 || dd<=0){
alert("输入身份证号,日期非法!");
return false;
}
if (id.charAt(17)=="x" || id.charAt(17)=="X")
{
if ("x"!=GetVerifyBit(id) && "X"!=GetVerifyBit(id)){
alert("身份证校验错误,请检查最后一位!");
return false;
}
}else{
if (id.charAt(17)!=GetVerifyBit(id)){
alert("身份证校验错误,请检查最后一位!");
return false;
}
}
birthday=id.substring(6,10) + "-" + id.substring(10,12) + "-" + id.substring(12,14);
if ("13579".indexOf(id.substring(16,17)) > -1){
sex="1";
}else{
sex="2";
}
}
return true;
}
//15位转18位中,计算校验位即最后一位
function GetVerifyBit(id){
var result;
var nNum=eval(id.charAt(0)*7+id.charAt(1)*9+id.charAt(2)*10+id.charAt(3)*5+id.charAt(4)*8+id.charAt(5)*4+id.charAt(6)*2+id.charAt(7)*1+id.charAt(8)*6+id.charAt(9)*3+id.charAt(10)*7+id.charAt(11)*9+id.charAt(12)*10+id.charAt(13)*5+id.charAt(14)*8+id.charAt(15)*4+id.charAt(16)*2);
nNum=nNum%11;
switch (nNum) {
case 0 :
result="1";
break;
case 1 :
result="0";
break;
case 2 :
result="X";
break;
case 3 :
result="9";
break;
case 4 :
result="8";
break;
case 5 :
result="7";
break;
case 6 :
result="6";
break;
case 7 :
result="5";
break;
case 8 :
result="4";
break;
case 9 :
result="3";
break;
case 10 :
result="2";
break;
}
//document.write(result);
return result;
}
//15位转18位
function Get18(idCard){
if (CheckValue(idCard)){
var id = idCard;
var id18=id;
if (id.length==0){
alert("请输入15位身份证号!");
return false;
}
if (id.length==15){
if (id.substring(6,8)>20){
id18=id.substring(0,6)+"19"+id.substring(6,15);
}else{
id18=id.substring(0,6)+"20"+id.substring(6,15);
}
id18=id18+GetVerifyBit(id18);
}
return id18;
}else{
return false;
}
}
function checkIdcard(idcard){
var Errors=new Array(
"验证通过!",
"身份证号码位数不对!",
"身份证号码出生日期超出范围或含有非法字符!",
"身份证号码校验错误!",
"身份证地区非法!"
);
var area={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 idcard,Y,JYM;
var S,M;
var idcard_array = new Array();
idcard_array = idcard.split("");
//地区检验
if(area[parseInt(idcard.substr(0,2))]==null) return Errors[4];
//身份号码位数及格式检验
switch(idcard.length){
case 15:
if ( (parseInt(idcard.substr(6,2))+1900) % 4 == 0 || ((parseInt(idcard.substr(6,2))+1900) % 100 == 0 && (parseInt(idcard.substr(6,2))+1900) % 4 == 0 )){
ereg=/^[1-9][0-9]{5}[0 -9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1 -9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;//测试出生日期的合法性
} else {
ereg =/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1]) |(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/; //测试出生日期的合法性
}
if(ereg.test(idcard)) return Errors[0];
else return Errors[2];
break;
case 18:
//18位身份号码检测
//出生日期的合法性检查
//闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
//平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
if ( parseInt(idcard.substr(6,4)) % 4 == 0 || (parseInt(idcard.substr(6,4)) % 100 == 0 && parseInt(idcard.substr(6,4))%4 == 0 )){
ereg=/^[1-9][0-9]{5}19[0-9]{2} ((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1 -2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;//闰年出生日期的合法性正则表达式
} else {
ereg =/^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1]) |(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0- 9Xx]$/;//平年出生日期的合法性正则表达式
}
if(ereg.test(idcard)){//测试出生日期的合法性
//计算校验位
S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7
+ (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9
+ (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10
+ (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5
+ (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8
+ (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4
+ (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2
+ parseInt(idcard_array[7]) * 1
+ parseInt(idcard_array[8]) * 6
+ parseInt(idcard_array[9]) * 3 ;
Y = S % 11;
M = "F";
JYM = "10X98765432";
M = JYM.substr(Y,1);//判断校验位
if(M == idcard_array[17]) return Errors[0]; //检测ID的校验位
else return Errors[3];
}
else return Errors[2];
break;
default:
return Errors[1];
break;
}
}
var sss = "000000000000000000"
document.write (checkIdcard(sss))
//身份证号码校验,并从中拆分出出生年月日和性别
var yyyy;
var mm;
var dd;
var birthday;
var sex;
function getYear(){
return yyyy;
}
function getMonth(){
return mm;
}
function getDate(){
return dd;
}
function getBirthday(){
return birthday;
}
function getSex(){
return sex;
}
function getAge(){
var mm=getMonth();
if (mm<10)
mm=mm.substring(1,2);
return Math.floor((parseInt(_getYear())*12+parseInt(_getMonth())-parseInt(getYear())*12-parseInt(mm))/12);
}
//判断是否大龄,男50,女40
function isBigAge(){
if (parseInt(getAge())>=40 && parseInt(getSex())==2)
return "1";
if (parseInt(getAge())>=50 && parseInt(getSex())==1)
return "1";
return "0";
}
//校验身份证号码
function CheckValue(idCard){
var id=idCard;
var id_length=id.length;
if (id_length==0){
alert("请输入身份证号码!");
return false;
}
if (id_length!=15 && id_length!=18){
alert("身份证号长度应为15位或18位!");
return false;
}
if (id_length==15){
yyyy="19"+id.substring(6,8);
mm=id.substring(8,10);
dd=id.substring(10,12);
if (mm>12 || mm<=0){
alert("输入身份证号,月份非法!");
return false;
}
if (dd>31 || dd<=0){
alert("输入身份证号,日期非法!");
return false;
}
birthday=yyyy+ "-" +mm+ "-" +dd;
if ("13579".indexOf(id.substring(14,15))!=-1){
sex="1";
}else{
sex="2";
}
}else if (id_length==18){
if (id.indexOf("X") > 0 && id.indexOf("X")!=17 || id.indexOf("x")>0 && id.indexOf("x")!=17){
alert("身份证中"X"输入位置不正确!");
return false;
}
yyyy=id.substring(6,10);
if (yyyy>2200 || yyyy<1900){
alert("输入身份证号,年度非法!");
return false;
}
mm=id.substring(10,12);
if (mm>12 || mm<=0){
alert("输入身份证号,月份非法!");
return false;
}
dd=id.substring(12,14);
if (dd>31 || dd<=0){
alert("输入身份证号,日期非法!");
return false;
}
if (id.charAt(17)=="x" || id.charAt(17)=="X")
{
if ("x"!=GetVerifyBit(id) && "X"!=GetVerifyBit(id)){
alert("身份证校验错误,请检查最后一位!");
return false;
}
}else{
if (id.charAt(17)!=GetVerifyBit(id)){
alert("身份证校验错误,请检查最后一位!");
return false;
}
}
birthday=id.substring(6,10) + "-" + id.substring(10,12) + "-" + id.substring(12,14);
if ("13579".indexOf(id.substring(16,17)) > -1){
sex="1";
}else{
sex="2";
}
}
return true;
}
//15位转18位中,计算校验位即最后一位
function GetVerifyBit(id){
var result;
var nNum=eval(id.charAt(0)*7+id.charAt(1)*9+id.charAt(2)*10+id.charAt(3)*5+id.charAt(4)*8+id.charAt(5)*4+id.charAt(6)*2+id.charAt(7)*1+id.charAt(8)*6+id.charAt(9)*3+id.charAt(10)*7+id.charAt(11)*9+id.charAt(12)*10+id.charAt(13)*5+id.charAt(14)*8+id.charAt(15)*4+id.charAt(16)*2);
nNum=nNum%11;
switch (nNum) {
case 0 :
result="1";
break;
case 1 :
result="0";
break;
case 2 :
result="X";
break;
case 3 :
result="9";
break;
case 4 :
result="8";
break;
case 5 :
result="7";
break;
case 6 :
result="6";
break;
case 7 :
result="5";
break;
case 8 :
result="4";
break;
case 9 :
result="3";
break;
case 10 :
result="2";
break;
}
//document.write(result);
return result;
}
//15位转18位
function Get18(idCard){
if (CheckValue(idCard)){
var id = idCard;
var id18=id;
if (id.length==0){
alert("请输入15位身份证号!");
return false;
}
if (id.length==15){
if (id.substring(6,8)>20){
id18=id.substring(0,6)+"19"+id.substring(6,15);
}else{
id18=id.substring(0,6)+"20"+id.substring(6,15);
}
id18=id18+GetVerifyBit(id18);
}
return id18;
}else{
return false;
}
}
function checkIdcard(idcard){
var Errors=new Array(
"验证通过!",
"身份证号码位数不对!",
"身份证号码出生日期超出范围或含有非法字符!",
"身份证号码校验错误!",
"身份证地区非法!"
);
var area={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 idcard,Y,JYM;
var S,M;
var idcard_array = new Array();
idcard_array = idcard.split("");
//地区检验
if(area[parseInt(idcard.substr(0,2))]==null) return Errors[4];
//身份号码位数及格式检验
switch(idcard.length){
case 15:
if ( (parseInt(idcard.substr(6,2))+1900) % 4 == 0 || ((parseInt(idcard.substr(6,2))+1900) % 100 == 0 && (parseInt(idcard.substr(6,2))+1900) % 4 == 0 )){
ereg=/^[1-9][0-9]{5}[0 -9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1 -9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;//测试出生日期的合法性
} else {
ereg =/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1]) |(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/; //测试出生日期的合法性
}
if(ereg.test(idcard)) return Errors[0];
else return Errors[2];
break;
case 18:
//18位身份号码检测
//出生日期的合法性检查
//闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
//平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
if ( parseInt(idcard.substr(6,4)) % 4 == 0 || (parseInt(idcard.substr(6,4)) % 100 == 0 && parseInt(idcard.substr(6,4))%4 == 0 )){
ereg=/^[1-9][0-9]{5}19[0-9]{2} ((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1 -2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;//闰年出生日期的合法性正则表达式
} else {
ereg =/^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1]) |(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0- 9Xx]$/;//平年出生日期的合法性正则表达式
}
if(ereg.test(idcard)){//测试出生日期的合法性
//计算校验位
S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7
+ (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9
+ (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10
+ (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5
+ (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8
+ (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4
+ (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2
+ parseInt(idcard_array[7]) * 1
+ parseInt(idcard_array[8]) * 6
+ parseInt(idcard_array[9]) * 3 ;
Y = S % 11;
M = "F";
JYM = "10X98765432";
M = JYM.substr(Y,1);//判断校验位
if(M == idcard_array[17]) return Errors[0]; //检测ID的校验位
else return Errors[3];
}
else return Errors[2];
break;
default:
return Errors[1];
break;
}
}
var sss = "000000000000000000"
document.write (checkIdcard(sss))
相关文章推荐
- 简单的身份证验证(JS)
- js实现身份证号码验证的简单实例
- JS简单验证身份证号
- js验证只能为数字 和 简单的身份证号码验证。。
- js验证真实姓名与身份证号,手机号的简单实例
- JS常见简单正则表达式验证功能小结【手机,地址,企业税号,金额,身份证等】
- JS实现的验证身份证及获取地区功能示例
- 简单强大的javascript表单验证 - Parsley.js
- [JS 最简单简洁的插件] 表单验证
- 用户体验超棒并且功能强大使用简单的javascript表单验证 - Parsley.js
- js表单验证是否空值的简单处理办法
- js验证身份证id
- 身份证号码验证(JS, 支持15和18位身份证)
- js 身份证号验证
- 写给新手:js的表单操作(二) 简单的表单提交验证
- js实现完美身份证号有效性验证--身份证算法
- jsp页面中文件上传时在页面上用JS加上简单的文件类型验证
- [转]JS严格验证身份证
- js正则验证两位小数 验证数字最简单正则表达式大全
- js实现身份证号码验证