身份证验证【正则表达式】

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 >

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值