代码
function IdentityCodeValid(code) { 
        var city={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:"国外 "};
        //var tip = "";
        var pass= true;
        
        //判断格式是否正确
        if(!code || !/^\d{2}(0[1-9]|[1-9][0-9])\d{2}((((1[6-9]|[2-9]\d)\d{2})(0[13578]|1[02])(0[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})(0[13456789]|1[012])(0[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})02(0[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))0229))\d{3}(\d|x|X)$/i.test(code)){
            //tip = "身份证号格式错误";
            pass = false;
        }
        //判断前两位的地址编码是否正确
       	else if(!city[code.substr(0,2)]){
            //tip = "地址编码错误";
            pass = false;
        }
        else{
            //18位身份证需要验证最后一位校验位
            if(code.length == 18){
                code = code.split('');
                //∑(ai×Wi)(mod 11)
                //加权因子
                var factor = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ];
                //校验位
                var parity = [ 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 ];
                var sum = 0;
                var ai = 0;
                var wi = 0;
                for (var i = 0; i < 17; i++)
                {
                    ai = code[i];
                    wi = factor[i];
                    sum += ai * wi;
                }
                var last = parity[sum % 11];
                if(parity[sum % 11] != code[17]){
                    //tip = "校验位错误";
                    pass =false;
                }
            }
        }
        return pass;
    }
说明
一代身份证自2013年1月1日起停止使用
正则分析
规则说明
15位身份证号码组成
格式:ddddddyymmddxxs共15位
- dddddd为6位的地方代码,根据这6位可以获得该身份证号所在地。
- yy为2位的年份代码,是身份证持有人的出身年份。
- mm为2位的月份代码,是身份证持有人的出身月份。
- dd为2位的日期代码,是身份证持有人的出身日。
- xx为2位的顺序码,这个是随机数。
- s为1位的性别代码,奇数代表男性,偶数代表女性。
18位身份证号码组成
格式:ddddddyyyymmddxxsp共18位
- dddddd为6位的地方代码,根据这6位可以获得该身份证号所在地。
- yyyy为4位的年份代码,是身份证持有人的出身年份。
- mm为2位的月份代码,是身份证持有人的出身月份。
- dd为2位的日期代码,是身份证持有人的出身日。
- xx为2位的顺序码,这个是随机数。
- s为1位的性别代码,奇数代表男性,偶数代表女性。
- p为校验位
其他部分都和15位的相同。年份代码由原来的2位升级到4位。最后一位为校验位。
| 编号 | 说明 | 规则 | 
|---|---|---|
| 前1、2位数字 | 所在省(直辖市、自治区)的代码 | 规则见说明1 | 
| 第3、4位数字 | 所在地级市(自治州)的代码 | 从01到99 | 
| 第5、6位数字 | 所在区(县、自治县、县级市)的代码 | 从00到99 | 
| 第7—14位数字 | 出生年、月、日 4位年2位月2位日, | 年从1900到2100,月从01到12,日从01到31 | 
| 第15、16位数字 | 所在地的派出所的代码 | 从00到99 | 
| 第17位数字 | 表示性别 | 奇数表示男性(1、3、5、7、9),偶数表示女性(0、2、4、6、8) | 
| 第18位数字 | 校检码 | 它是用来检验身份证的正确性。规则见说明2 | 
所在省(直辖市、自治区)的代码
| 代码 | 地区 | 代码 | 地区 | 
|---|---|---|---|
| 11-15 | 京 津 冀 晋 蒙 | 21-23 | 辽 吉 黑 | 
| 31-37 | 沪 苏 浙 皖 闽 赣 鲁 | 41-46 | 豫 鄂 湘 粤 桂 琼 | 
| 50-54 | 渝 川 贵 云 藏 | 61-65 | 陕 甘 青 宁 新 | 
| 81-82 | 港 澳 | 71 | 台湾 | 

校验码规则
- 十七位数字本体码加权求和公式
- S = Sum(Ai * Wi), i = 0, … , 16,先对前17位数字的权求和
- Ai:表示第i位置上的身份证号码数字值
- Wi:表示第i位置上的加权因子
- Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
- 计算模
- Y = mod(S, 11)
- 通过模得到对应的校验码
- Y: 0 1 2 3 4 5 6 7 8 9 10
- 校验码: 1 0 X 9 8 7 6 5 4 3 2
也就是说,如果得到余数为1则最后的校验位p应该为对应的0.如果校验位不是,则该身份证号码不正确。