Created
October 29, 2014 19:01
-
-
Save z007/033e3f2b423e77244b90 to your computer and use it in GitHub Desktop.
正则表达式Id card(身份证)验证
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
来源:http://www.cnblogs.com/devinhua/articles/1726292.html | |
1、简单的正则表达式: | |
(1)preg_match("/^(\d{18,18}|\d{15,15}|\d{17,17}x)$/",$id_card) | |
(2)preg_match("/^(\d{6})(18|19|20)?(\d{2})([01]\d)([0123]\d)(\d{3}) (\d|X)?$/",$id_card) | |
(3)preg_match("/(^\d{15}$/)|(\d{17}(?:\d|x|X)$/),$id_card) | |
2、复杂并且严格一些的验证: | |
//这个可以验证15位和18位的身份证,并且包含生日和校验位的验证。 | |
//如果有兴趣,还可以加上身份证所在地的验证,就是前6位有些数字合法有些数字不合法。 | |
function isIdCardNo(num) | |
{ | |
num = num.toUpperCase(); | |
//身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。 | |
if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))) | |
{ | |
alert('输入的身份证号长度不对,或者号码不符合规定!\n15位号码应全为数字,18位号码末位可以为数字或X。'); | |
return false; | |
} | |
//校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 | |
//下面分别分析出生日期和校验位 | |
var len, re; | |
len = num.length; | |
if (len == 15) | |
{ | |
re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/); | |
var arrSplit = num.match(re); | |
//检查生日日期是否正确 | |
var dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4]); | |
var bGoodDay; | |
bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4])); | |
if (!bGoodDay) | |
{ | |
alert('输入的身份证号里出生日期不对!'); | |
return false; | |
} | |
else | |
{ | |
//将15位身份证转成18位 | |
//校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 | |
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 nTemp = 0, i; | |
num = num.substr(0, 6) + '19' + num.substr(6, num.length - 6); | |
for(i = 0; i < 17; i ++) | |
{ | |
nTemp += num.substr(i, 1) * arrInt[i]; | |
} | |
num += arrCh[nTemp % 11]; | |
return num; | |
} | |
} | |
if (len == 18) | |
{ | |
re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/); | |
var arrSplit = num.match(re); | |
//检查生日日期是否正确 | |
var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]); | |
var bGoodDay; | |
bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4])); | |
if (!bGoodDay) | |
{ | |
alert(dtmBirth.getYear()); | |
alert(arrSplit[2]); | |
alert('输入的身份证号里出生日期不对!'); | |
return false; | |
} | |
else | |
{ | |
//检验18位身份证的校验码是否正确。 | |
//校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 | |
var valnum; | |
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 nTemp = 0, i; | |
for(i = 0; i < 17; i ++) | |
{ | |
nTemp += num.substr(i, 1) * arrInt[i]; | |
} | |
valnum = arrCh[nTemp % 11]; | |
if (valnum != num.substr(17, 1)) | |
{ | |
alert('18位身份证的校验码不正确!应该为:' + valnum); | |
return false; | |
} | |
return num; | |
} | |
} | |
return false; | |
} | |
3、严格的验证: | |
<script> | |
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:"新Unbsp;疆",71:"台湾",81:"香港",82:"澳门",91:"国外 "} | |
function cidInfo(sId){ | |
var iSum=0 | |
var info="" | |
if(!/^d{17}(d|x)$/i.test(sId))return false; | |
sId=sId.replace(/x$/i,"a"); | |
if(aCity[parseInt(sId.substr(0,2))]==null)return "Error:非法地区"; | |
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 "Error:非法生日"; | |
for(var i = 17;i>=0;i --) iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 - i),11) | |
if(iSum%11!=1)return "Error:非法证号"; | |
return aCity[parseInt(sId.substr(0,2))]+","+sBirthday+","+(sId.substr(16,1)%2?" 男":"女") | |
} | |
document.write(cidInfo("380524198002300016"),"<br/>"); | |
document.write(cidInfo("340524198002300019"),"<br/>") | |
document.write(cidInfo("340524197711111111"),"<br/>") | |
document.write(cidInfo("34052419800101001x"),"<br/>"); | |
</script> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment