<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>emu's test</TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="emu">
<META NAME="Keywords" CONTENT="javascript">
<META NAME="Description" CONTENT="functions to check id card number">
</HEAD><BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
function getDateByMask(s,m){
if (s.length!=m.length){
return false;
}
var t = m.replace(/d/ig,"\\d").replace(/m/ig,"\\d").replace(/y/ig,"\\d")
var r = new RegExp("^"+t+"$");
if (!r.test(s)) return false;
try{
m=m.replace(/Y/g,"y").replace(/D/g,"d");
if (m.indexOf("yyyy")>-1)
return new Date(
s.substr(m.indexOf("yyyy"),4),
s.substr(m.indexOf("MM"),2)-1,
s.substr(m.indexOf("dd"),2)
)
else return new Date(
s.substr(m.indexOf("yy"),2),
s.substr(m.indexOf("MM"),2)-1,
s.substr(m.indexOf("dd"),2)
)
}catch (e){
return null;
}
}function checkDateByMask(s,m){
if (s.length!=m.length){
return false;
}
try{
var d = getDateByMask(s,m)
m=m.replace(/Y/g,"y").replace(/D/g,"d");
if (m.indexOf("yyyy")>-1)
return (
d.getFullYear() == s.substr(m.indexOf("yyyy"),4)
&& d.getMonth() == s.substr(m.indexOf("MM"),2)-1
&& d.getDate() == s.substr(m.indexOf("dd"),2)
&& d.getFullYear() >= 1900
)
else return (
d.getYear() == s.substr(m.indexOf("yy"),2)
&& d.getMonth() == s.substr(m.indexOf("MM"),2)-1
&& d.getDate() == s.substr(m.indexOf("dd"),2)
)
}
catch (e){
return false;
}
}function checkIdCardNo(s){
var r18 = /^[1-9]\d{5}(\d{8})\d{4}$/
var r15 = /^[1-9]\d{5}(\d{6})\d{3}$/
if (r18.test(s)){
var t=s.match(r18)[1];
if (checkDateByMask(t,"yyyyMMdd")){
alert("18位号码验证通过")
}else{
alert("不合法的18位身份证号码")
}
}else if (r15.test(s)){
var t=s.match(r15)[1];
if (checkDateByMask(t,"yyMMdd")){
alert("15位号码验证通过")
}else{
alert("不合法的15位身份证号码")
}
}else {
alert("身份证号码位数不对!")
}
}//-->
</SCRIPT><input id=idCardNo>
<input type=button onclick="checkIdCardNo(idCardNo.value)" value="check">
</BODY>
</HTML>
<HTML>
<HEAD>
<TITLE>emu's test</TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="emu">
<META NAME="Keywords" CONTENT="javascript">
<META NAME="Description" CONTENT="functions to check id card number">
</HEAD><BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
function getDateByMask(s,m){
if (s.length!=m.length){
return false;
}
var t = m.replace(/d/ig,"\\d").replace(/m/ig,"\\d").replace(/y/ig,"\\d")
var r = new RegExp("^"+t+"$");
if (!r.test(s)) return false;
try{
m=m.replace(/Y/g,"y").replace(/D/g,"d");
if (m.indexOf("yyyy")>-1)
return new Date(
s.substr(m.indexOf("yyyy"),4),
s.substr(m.indexOf("MM"),2)-1,
s.substr(m.indexOf("dd"),2)
)
else return new Date(
s.substr(m.indexOf("yy"),2),
s.substr(m.indexOf("MM"),2)-1,
s.substr(m.indexOf("dd"),2)
)
}catch (e){
return null;
}
}function checkDateByMask(s,m){
if (s.length!=m.length){
return false;
}
try{
var d = getDateByMask(s,m)
m=m.replace(/Y/g,"y").replace(/D/g,"d");
if (m.indexOf("yyyy")>-1)
return (
d.getFullYear() == s.substr(m.indexOf("yyyy"),4)
&& d.getMonth() == s.substr(m.indexOf("MM"),2)-1
&& d.getDate() == s.substr(m.indexOf("dd"),2)
&& d.getFullYear() >= 1900
)
else return (
d.getYear() == s.substr(m.indexOf("yy"),2)
&& d.getMonth() == s.substr(m.indexOf("MM"),2)-1
&& d.getDate() == s.substr(m.indexOf("dd"),2)
)
}
catch (e){
return false;
}
}function checkIdCardNo(s){
var r18 = /^[1-9]\d{5}(\d{8})\d{4}$/
var r15 = /^[1-9]\d{5}(\d{6})\d{3}$/
if (r18.test(s)){
var t=s.match(r18)[1];
if (checkDateByMask(t,"yyyyMMdd")){
alert("18位号码验证通过")
}else{
alert("不合法的18位身份证号码")
}
}else if (r15.test(s)){
var t=s.match(r15)[1];
if (checkDateByMask(t,"yyMMdd")){
alert("15位号码验证通过")
}else{
alert("不合法的15位身份证号码")
}
}else {
alert("身份证号码位数不对!")
}
}//-->
</SCRIPT><input id=idCardNo>
<input type=button onclick="checkIdCardNo(idCardNo.value)" value="check">
</BODY>
</HTML>
{
if(s.length!=15&&s.length!=18)
{
return false;
}
if(s.length==15)
{
var pattern=/^[0-9]{15}$/;
flag=pattern.test(s);
if(!flag)
{
return false;
}
}
if(s.length==18)
{
var pattern=/^[0-9]{17}$/;
flag=pattern.test(s.substring(0,17));
if(flag)
{
psub=s.substring(17,18)
if(!/^[0-9]{1}$/.test(psub)&&psub!="x"&&psub!="X")
{
return false;
}
}
else
{
return false;
}
}
return true;
}不过没有判定出生日期的,你可以加进去
的GB11643-1999《公民身份号码》中做了明确的规定。
GB11643-1999《公民身份号码》为GB11643-1989《社会保障
号码》的修订版,其中指出将原标准名称“社会保障号码”更名
为“公民身份号码”,另外GB11643-1999《公民身份号码》从实
施之日起代替GB11643-1989。
GB11643-1999《公民身份号码》主要内容如下:
一、范围
该标准规定了公民身份号码的编码对象、号码的结构和表现
形式,使每个编码对象获得一个唯一的、不变的法定号码。
二、编码对象
公民身份号码的编码对象是具有中华人民共和国国籍的公民。
三、号码的结构和表示形式
1、号码的结构
公民身份号码是特征组合码,由十七位数字本体码和一位校
验码组成。排列顺序从左至右依次为:六位数字地址码,八位数
字出生日期码,三位数字顺序码和一位数字校验码。
2、地址码
表示编码对象常住户口所在县(市、旗、区)的行政区划代码,
按GB/T2260的规定执行。
3、出生日期码
表示编码对象出生的年、月、日,按GB/T7408的规定执行,
年、月、日代码之间不用分隔符。
4、顺序码
表示在同一地址码所标识的区域范围内,对同年、同月、同
日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配
给女性。
5、校验码
(1)十七位数字本体码加权求和公式
S = Ai * Wi, i = 2, ... , 18
Y = mod(S, 11)
i: 表示号码字符从右至左包括校验码字符在内的位置序号
Ai:表示第i位置上的身份证号码字符值
Wi:表示第i位置上的加权因子
i: 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
(2)校验码字符值的计算
Y: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2
四、举例如下:
北京市朝阳区: 11010519491231002X
广东省汕头市: 440524188001010014
:)
JK是湖北人
那一段话是引用别人的回复,我己在前面注明了:
http://expert.csdn.net/Expert/topic/1187/1187634.xml?temp=.2875635