外國人永居居留證的證號校驗(yàn)

根據(jù)國人身份證校驗(yàn)規(guī)則調(diào)整外國人身份證校驗(yàn)

根據(jù)國家移民管理局公布的新版外國人永久居留身份證適配性改造要點(diǎn)。核心點(diǎn)如果下圖:

1.jpg

你會(huì)發(fā)現(xiàn)18位身份證,我們的身份證和外國人永居證的差別只是前6位的校驗(yàn)不同访敌。

  • 身份證校驗(yàn)規(guī)則:
//身份證
            function checkSFZ(_sfz) {
                var vcity = {
                    11: "北京",
                    12: "天津",
                    13: "河北",
                    14: "山西",
                    15: "內(nèi)蒙古",
                    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: "臺(tái)灣",
                    81: "香港",
                    82: "澳門",
                    91: "國外"
                };

                // 檢查號碼是否符合規(guī)范豹绪,包括長度茎刚,類型
                var isCardNo = function (card) {
                    // 身份證號碼為15位或者18位梧却,15位時(shí)全為數(shù)字缘挑,18位前17位為數(shù)字鸣剪,最后一位是校驗(yàn)位沟突,可能為數(shù)字或字符X
                    var reg = /(^\d{15}$)|(^\d{17}(\d|X)$)/;
                    if (reg.test(card) === false) {
                        return false;
                    }
                    return true;
                };

                // 取身份證前兩位,校驗(yàn)省份
                var checkProvince = function (card) {
                    var province = card.substr(0, 2);
                    if (vcity[province] == undefined) {
                        return false;
                    }
                    return true;
                };

                // 檢查生日是否正確
                var checkBirthday = function (card) {
                    var len = card.length;
                    // 身份證15位時(shí)花颗,次序?yàn)槭。?位)市(3位)年(2位)月(2位)日(2位)校驗(yàn)位(3位)惠拭,皆為數(shù)字
                    if (len == '15') {
                        var re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/;
                        var arr_data = card.match(re_fifteen);
                        var year = arr_data[2];
                        var month = arr_data[3];
                        var day = arr_data[4];
                        var birthday = new Date('19' + year + '/' + month + '/' + day);
                        return verifyBirthday('19' + year, month, day, birthday);
                    }
                    // 身份證18位時(shí)扩劝,次序?yàn)槭。?位)市(3位)年(4位)月(2位)日(2位)校驗(yàn)位(4位)职辅,校驗(yàn)位末尾可能為X
                    if (len == '18') {
                        var re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/;
                        var arr_data = card.match(re_eighteen);
                        var year = arr_data[2];
                        var month = arr_data[3];
                        var day = arr_data[4];
                        var birthday = new Date(year + '/' + month + '/' + day);
                        return verifyBirthday(year, month, day, birthday);
                    }
                    return false;
                };

                // 校驗(yàn)日期
                var verifyBirthday = function (year, month, day, birthday) {
                    var now = new Date();
                    var now_year = now.getFullYear();
                    // 年月日是否合理
                    if (birthday.getFullYear() == year
                        && (birthday.getMonth() + 1) == month
                        && birthday.getDate() == day) {
                        // 判斷年份的范圍(3歲到100歲之間)
                        var time = now_year - year;
                        if (time <= 120) {
                            return true;
                        }
                        return false;
                    }
                    return false;
                };

                // 校驗(yàn)位的檢測
                var checkParity = function (card) {
                    // 15位轉(zhuǎn)18位
                    card = changeFivteenToEighteen(card);
                    var len = card.length;
                    if (len == '18') {
                        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 cardTemp = 0, i, valnum;
                        for (i = 0; i < 17; i++) {
                            cardTemp += card.substr(i, 1) * arrInt[i];
                        }
                        valnum = arrCh[cardTemp % 11];
                        if (valnum == card.substr(17, 1)) {
                            return true;
                        }
                        return false;
                    }
                    return false;
                };

                // 15位轉(zhuǎn)18位身份證號
                var changeFivteenToEighteen = function (card) {
                    if (card.length == '15') {
                        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 cardTemp = 0, i;
                        card = card.substr(0, 6) + '19'
                            + card.substr(6, card.length - 6);
                        for (i = 0; i < 17; i++) {
                            cardTemp += card.substr(i, 1) * arrInt[i];
                        }
                        card += arrCh[cardTemp % 11];
                        return card;
                    }
                    return card;
                };

                var checkCode = function (_sfz) {
                    // 是否為空
                    if (_sfz === '') {
                        // alert('請輸入身份證號棒呛,身份證號不能為空');
                        return false;
                    }
                    // 校驗(yàn)長度,類型
                    if (isCardNo(_sfz) === false) {
                        // alert('您輸入的身份證號碼不正確域携,請重新輸入');
                        return false;
                    }
                    // 檢查省份
                    if (checkProvince(_sfz) === false) {
                        // alert('您輸入的身份證號碼不正確,請重新輸入');
                        return false;
                    }
                    // 校驗(yàn)生日
                    if (checkBirthday(_sfz) === false) {
                        // alert('您輸入的身份證號碼生日不正確,請重新輸入');
                        return false;
                    }
                    // 檢驗(yàn)位的檢測
                    if (checkParity(_sfz) === false) {
                        // alert('您的身份證校驗(yàn)位不正確,請重新輸入');
                        return false;
                    }
                    return true;
                }

                return checkCode(_sfz);
            }
            
  • 外國人永居證校驗(yàn)規(guī)則:
//外國人身份證(新版永居證證件號碼18位)
            function checkOutSFZ(_sfz) {
                //參考移民管理局的文檔:https://www.nia.gov.cn/20231013/2.pdf
                //格式:9(身份標(biāo)識碼) 32(受理地代碼) 682(國家和地區(qū)代碼) 19850101(出生日期) 001(順序碼) 7(校驗(yàn)碼)簇秒。
                var vcity = {
                    11: "北京",
                    12: "天津",
                    13: "河北",
                    14: "山西",
                    15: "內(nèi)蒙古",
                    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: "臺(tái)灣",
                    81: "香港",
                    82: "澳門",
                    91: "國外"
                };

                // 檢查號碼是否符合規(guī)范,包括長度秀鞭,類型
                var isCardNo = function (card) {
                    //18位前17位為數(shù)字趋观,最后一位是校驗(yàn)位,可能為數(shù)字或字符X
                    var reg = /(^\d{17}(\d|X)$)/;
                    if (reg.test(card) === false) {
                        return false;
                    }
                    return true;
                };

                // 取身份證前1位,校驗(yàn)身份標(biāo)識锋边,1-8位國內(nèi)人士皱坛,9為外國人。
                var personMark = function (card){
                    var mark = card.substring(0,1);
                    return mark==9;//是外國人
                };

                // 取身份證前2,3位,校驗(yàn)省份
                var checkProvince = function (card) {
                    var province = card.substring(1,3);
                    if (vcity[province] == undefined) {
                        return false;
                    }
                    return true;
                };

                // 檢查生日是否正確
                var checkBirthday = function (card) {
                    var len = card.length;
                    // 身份證15位時(shí)豆巨,次序?yàn)槭剩辟。?位)市(3位)年(2位)月(2位)日(2位)校驗(yàn)位(3位),皆為數(shù)字
                    if (len == '15') {
                        var re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/;
                        var arr_data = card.match(re_fifteen);
                        var year = arr_data[2];
                        var month = arr_data[3];
                        var day = arr_data[4];
                        var birthday = new Date('19' + year + '/' + month + '/' + day);
                        return verifyBirthday('19' + year, month, day, birthday);
                    }
                    // 身份證18位時(shí)往扔,次序?yàn)槭贩猎。?位)市(3位)年(4位)月(2位)日(2位)校驗(yàn)位(4位),校驗(yàn)位末尾可能為X
                    if (len == '18') {
                        var re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/;
                        var arr_data = card.match(re_eighteen);
                        var year = arr_data[2];
                        var month = arr_data[3];
                        var day = arr_data[4];
                        var birthday = new Date(year + '/' + month + '/' + day);
                        return verifyBirthday(year, month, day, birthday);
                    }
                    return false;
                };

                // 校驗(yàn)日期
                var verifyBirthday = function (year, month, day, birthday) {
                    var now = new Date();
                    var now_year = now.getFullYear();
                    // 年月日是否合理
                    if (birthday.getFullYear() == year
                        && (birthday.getMonth() + 1) == month
                        && birthday.getDate() == day) {
                        // 判斷年份的范圍(3歲到100歲之間)
                        var time = now_year - year;
                        if (time <= 120) {
                            return true;
                        }
                        return false;
                    }
                    return false;
                };

                // 校驗(yàn)位的檢測
                var checkParity = function (card) {
                    // 15位轉(zhuǎn)18位
                    card = changeFivteenToEighteen(card);
                    var len = card.length;
                    if (len == '18') {
                        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 cardTemp = 0, i, valnum;
                        for (i = 0; i < 17; i++) {
                            cardTemp += card.substr(i, 1) * arrInt[i];
                        }
                        valnum = arrCh[cardTemp % 11];
                        if (valnum == card.substr(17, 1)) {
                            return true;
                        }
                        return false;
                    }
                    return false;
                };

                // 15位轉(zhuǎn)18位身份證號
                var changeFivteenToEighteen = function (card) {
                    if (card.length == '15') {
                        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 cardTemp = 0, i;
                        card = card.substr(0, 6) + '19'
                            + card.substr(6, card.length - 6);
                        for (i = 0; i < 17; i++) {
                            cardTemp += card.substr(i, 1) * arrInt[i];
                        }
                        card += arrCh[cardTemp % 11];
                        return card;
                    }
                    return card;
                };

                var checkCode = function (_sfz) {
                    // 是否為空
                    if (_sfz === '') {
                        // alert('請輸入身份證號萍膛,身份證號不能為空');
                        return false;
                    }
                    // 校驗(yàn)長度吭服,類型
                    if (isCardNo(_sfz) === false) {
                        // alert('您輸入的身份證號碼不正確,請重新輸入');
                        return false;
                    }
                    // 檢查身份標(biāo)識蝗罗,國內(nèi)人噪馏,還是外國人
                    if (personMark(_sfz) === false) {
                        // alert('您輸入的身份證號碼不正確,請重新輸入');
                        return false;
                    }
                    if (checkProvince(_sfz) === false) {
                        // alert('您輸入的身份證號碼不正確,請重新輸入');
                        return false;
                    }
                    // 校驗(yàn)生日
                    if (checkBirthday(_sfz) === false) {
                        // alert('您輸入的身份證號碼生日不正確,請重新輸入');
                        return false;
                    }
                    // 檢驗(yàn)位的檢測
                    if (checkParity(_sfz) === false) {
                        // alert('您的身份證校驗(yàn)位不正確,請重新輸入');
                        return false;
                    }
                    return true;
                }

                return checkCode(_sfz);
            }

注:如果你想校驗(yàn)得更詳細(xì),可以把國家代碼校驗(yàn)(證號的前4-6位绿饵,參考全球所有的國家代碼/國家區(qū)號欠肾,添加枚舉校驗(yàn)),性別校驗(yàn)(證號的倒數(shù)第2位拟赊,1-男刺桃,2-女)加上。甚至2017 版外國人永久居留身份證也能做一些基礎(chǔ)校驗(yàn)吸祟。這個(gè)自行添加瑟慈。

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末桃移,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子葛碧,更是在濱河造成了極大的恐慌借杰,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件进泼,死亡現(xiàn)場離奇詭異蔗衡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)乳绕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門绞惦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人洋措,你說我怎么就攤上這事济蝉。” “怎么了菠发?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵王滤,是天一觀的道長。 經(jīng)常有香客問我滓鸠,道長淑仆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任哥力,我火速辦了婚禮,結(jié)果婚禮上墩弯,老公的妹妹穿的比我還像新娘吩跋。我一直安慰自己,他們只是感情好渔工,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布锌钮。 她就那樣靜靜地躺著,像睡著了一般引矩。 火紅的嫁衣襯著肌膚如雪梁丘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天旺韭,我揣著相機(jī)與錄音氛谜,去河邊找鬼。 笑死区端,一個(gè)胖子當(dāng)著我的面吹牛值漫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播织盼,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼杨何,長吁一口氣:“原來是場噩夢啊……” “哼酱塔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起危虱,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤羊娃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后埃跷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蕊玷,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年捌蚊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了集畅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缅糟,死狀恐怖挺智,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窗宦,我是刑警寧澤赦颇,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站赴涵,受9級特大地震影響媒怯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜髓窜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一扇苞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寄纵,春花似錦鳖敷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至恃鞋,卻和暖如春崖媚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恤浪。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工畅哑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人水由。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓敢课,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子直秆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容