<!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>

解决方案 »

  1.   

    function CheckPersonalID(s)
    {
    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;
    }不过没有判定出生日期的,你可以加进去
      

  2.   

    http://expert.csdn.net/Expert/topic/1187/1187634.xml?temp=.2875635    18位身份证标准在国家质量技术监督局于1999年7月1日实施
    的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
      

  3.   

    emu:
    :)
    JK是湖北人
    那一段话是引用别人的回复,我己在前面注明了:
    http://expert.csdn.net/Expert/topic/1187/1187634.xml?temp=.2875635