新旧身份证合法性验证及相互转换算法(二):JavaScript身份证号码验证-支持新的带x身份证...

本文介绍了一个用于验证身份证号码正确性的JavaScript算法,支持15位及18位(含X)的身份证号码验证,并包含了日期格式的校验。该算法通过位权值计算校验码,确保身份证号码的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>身份证号码验证-支持新的带x身份证</title>
<script language="javascript">
//身份证号码验证-支持新的带x身份证
//
function check_ID_card() {
var ID_card = document.all('idcard').value;
var IDcardLen = ID_card.length;
var fMod = 11; //身份证算法求模关键值
var oldIDLen = 15; //旧身份证长度
var newIDLen = 18; //新身份证长度
var yearFlag = "19"; //新身份证年份标志
var Wi = new Array(); //位权值数组
var varArray = new Array();
var birthday = ''; //生日
var checkDigit = ''; //校验位
var numSum = 0; //数字和
var regStr = /^\d{15,17}([\dxX]{1})?$/;

if ((IDcardLen != 15) && (IDcardLen != 18)) {
alert("身份证长度必须为15或18位.");
return false;
}
if(!regStr.test(ID_card)){
alert("身份证号码必须为数字(18位的新身份证最后一位可以是x).");
return false;
}
if(IDcardLen == 15){
birthday = "19" + ID_card.substring(6,8) + "-" + ID_card.substring(8,10) + "-" + ID_card.substring(10,12);
}else{
birthday = ID_card.substring(6,10) + "-" + ID_card.substring(10,12) + "-" + ID_card.substring(12,14);
}
if(!isDate(birthday)){
alert("身份证号码中的日期格式不对(第6-12位).");
return false;
}
if(IDcardLen == 18){
for(var i=0;i<newIDLen-1;i++){
var k = Math.pow(2,newIDLen-1-i);
Wi[i] = k % 11;
}
for(var i=0;i<IDcardLen-1;i++){
varArray[i] = ID_card.charAt(i);
varArray[i] = varArray[i]*Wi[i];
numSum = numSum + varArray[i];
}
checkDigit = 12 - numSum % 11;
switch (checkDigit) {
case 10:
checkDigit = 'X';
break;
case 11:
checkDigit = 0;
break;
case 12:
checkDigit = 1;
break;
}
// check last digit
if (ID_card.charAt(17).toUpperCase() != checkDigit) {
alert("身份证最后一位校验码不对,应该为"+checkDigit+".");
return false;
}
}
alert(ID_card+"为正确的身份证号码.");
return true;
}

//日期格式验证(yyyy-mm-dd,其中月,日可以只有一位)
//
function isDate(dateStr){
var B, D=0;
// Split into $1 $2 $3
B = /^(\d{4})-(\d|\d\d)-(\d|\d\d)$/.test(dateStr);
if (B) with (RegExp){
// $1 $2 $3 = Y M D
D = new Date($1, $2-1, $3);
// test Y M D valid
B = ((D.getMonth()==$2-1) && (D.getFullYear()==$1));
}
return B;
}
</script>
</head>
<body>
<form name='frm' onSubmit="check_ID_card();return false;">
<center>
身份证号码:<input type='text' name='idcard' value="">  
<input type=submit value='验证'>
</center>
</form>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值