网页特效身份证验证正则与详细说明
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:"新疆",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>这款是游戏网站上找到的
<script language="javascript" type="text/javascript">
function checkidcardfield(v_card) {
var reg = /^d{15}(d{2}[0-9x])?$/i;
if (!reg.test(v_card)) {
return false;
}
if (v_card.length == 15) {
var n = new date();
var y = n.getfullyear();
if (parseint("19" + v_card.substr(6, 2)) < 1900 || parseint("19" + v_card.substr(6, 2)) > y) {
return false;
}
var birth = "19" + v_card.substr(6, 2) + "-" + v_card.substr(8, 2) + "-" + v_card.substr(10, 2);
if (!isdate(birth)) {
return false;
}
}
if (v_card.length == 18) {
var n = new date();
var y = n.getfullyear();
if (parseint(v_card.substr(6, 4)) < 1900 || parseint(v_card.substr(6, 4)) > y) {
return false;
}
var birth = v_card.substr(6, 4) + "-" + v_card.substr(10, 2) + "-" + v_card.substr(12, 2);
if (!isdate(birth)) {
return false;
}
iw = new array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1);
isum = 0;
for (i = 0; i < 17; i++) {
ic = v_card.charat(i);
ival = parseint(ic);
isum += ival * iw[i];
}
ijym = isum % 11;
if (ijym == 0) sjym = "1";
else if (ijym == 1) sjym = "0";
else if (ijym == 2) sjym = "x";
else if (ijym == 3) sjym = "9";
else if (ijym == 4) sjym = "8";
else if (ijym == 5) sjym = "7";
else if (ijym == 6) sjym = "6";
else if (ijym == 7) sjym = "5";
else if (ijym == 8) sjym = "4";
else if (ijym == 9) sjym = "3";
else if (ijym == 10) sjym = "2";
var ccheck = v_card.charat(17).tolowercase();
if (ccheck != sjym) {
return false;
}
}
return true;
}
</script>