校验身份证合法性

// JScript 文件
// 检查电话号码合法性
function checkmobile(value){
        if(/^13\d{9}$/g.test(value) || (/^15[0-35-9]\d{8}$/g.test(value)) || (/^18[0-9]\d{8}$/g.test(value)) || (/^14[457]\d{8}$/g.test(value))) {
            return true;
        }
        return false;            
    }
    
// 检查大陆身份证号合法性
function checkCard(card) {   
        var Errors=new Array(   
            "验证通过!",   
            "身份证号码位数不对!",   
            "身份证号码出生日期超出范围或含有非法字符!",   
            "身份证号码校验错误!",   
            "身份证地区非法!");   
      
        // 得到地区集合数组   
        var area = getArea();   
        var card_array=card.split("");   
        // s为1位的性别代码,奇数代表男性,偶数代表女性   
           
        var ereg, JYM, S, Y;   
        // 验证身份证地区是否合法   
        if (area[card.substring(0, 2)] == null){
            alert(Errors[4]);    
            return false;
        }
        switch (card.length) {   
            // 15位身份证验证   
            case 15:   
                if ((parseInt(card.substr(6, 2)) + 1900) % 4 == 0   
                        || ((parseInt(card.substr(6, 2)) + 1900) % 100 == 0 && (parseInt(card   
                                .substr(6, 2)) + 1900) % 4 == 0)) {   
                    ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2] [0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9])) [0-9]{3}$/;// 测试出生日期的合法性   
                } else {
                    ereg = /^[1-9][0-9]{5}[0-9]{2} ((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]| [1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;// 测试出生日期的合法性   
                }   
                if (ereg.test(card)){   
                    return true;
                }
                else{   
                    alert(Errors[2]);
                    return false;
                }
                break;   
            // 18位身份证验证   
            case 18:   
                // 18位身份号码检测   
                // 出生日期的合法性检查   
                // 闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|   
                // (04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))   
                // 平年月日:   
                // ((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))   
                var currentTime = new Date();
                
                if (parseInt(card.substr(6, 4)) >= currentTime.getFullYear()) {
                    alert("身份证号年份不合法,请检查输入!");    
                    return false;
                }
                if (parseInt(card.substr(6, 4)) % 4 == 0   
                        || (parseInt(card.substr(6, 4)) % 100 == 0 && parseInt(card   
                                .substr(6, 4)) % 4 == 0)) {
                    // /^[1-9][0-9]{5}19[0-9]{2}
                    ereg = /^[1-9][0-9]{5}[1-2][0|9][0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;// 闰年出生日期的合法性正则表达式   
                } else {   
                    ereg = /^[1-9][0-9]{5}[1-2][0|9][0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;// 平年出生日期的合法性正则表达式   
                }   
                if (ereg.test(card)) {// 测试出生日期的合法性   
                    // 计算校验位   
                    S = (parseInt(card_array[0]) + parseInt(card_array[10])) * 7   
                            + (parseInt(card_array[1]) + parseInt(card_array[11]))   
                            * 9   
                            + (parseInt(card_array[2]) + parseInt(card_array[12]))   
                            * 10   
                            + (parseInt(card_array[3]) + parseInt(card_array[13]))   
                            * 5   
                            + (parseInt(card_array[4]) + parseInt(card_array[14]))   
                            * 8   
                            + (parseInt(card_array[5]) + parseInt(card_array[15]))   
                            * 4   
                            + (parseInt(card_array[6]) + parseInt(card_array[16]))   
                            * 2 + parseInt(card_array[7]) * 1   
                            + parseInt(card_array[8]) * 6 + parseInt(card_array[9])   
                            * 3;   
                    Y = S % 11;   
                    M = "F";   
                    JYM = "10X98765432";   
                    M = JYM.substr(Y, 1);// 判断校验位
                    
                    if (M == card_array[17].toUpperCase()){
                        return true; // 检测ID的校验位   
                    }
                    
                    else{   
                        alert(Errors[3]);    
                        return false;
                    }
                } else{   
                    alert(Errors[2]);    
                    return false;
                }
                break;   
            break;   
        }   
        alert(Errors[1]);
        return false;
    }   
    function getArea() {   
        var area = {   
            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 :"国外"   
        };
        return area;   
    }

 

posted on 2016-08-07 21:21  Error503  阅读(984)  评论(0编辑  收藏  举报

导航