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>
本文来自济南网站建设,转载请标明出处:http://www.jnqz.net