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、复杂并且严格一些的验证:
function isIdCardNo(num)
{
num = num.toUpperCase();
if
(!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num)))
{
alert(
'输入的身份证号长度不对,或者号码不符合规定!\n15位号码应全为数字,18位号码末位可以为数字或X。'
);
return
false
;
}
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
{
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
{
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、严格的验证:
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"
),
"
"
);
document.write(cidInfo(
"340524198002300019"
),
"
"
)
document.write(cidInfo(
"340524197711111111"
),
"
"
)
document.write(cidInfo(
"34052419800101001x"
),
"
"
);