我們在做網路網站時,註冊個人資料時,常常要用到身分證號,我們需要對身分證進驗證,不然別人隨便輸個號碼就通過,讓你感覺這個網站做得很shit。
身分證號碼是有規則的。
結構形式
1.號碼的結構
公民身份號碼是特徵組合碼,由十七位數本體碼和一位校驗碼組成。排列順序由左至右依序為:六位數字位址碼,八位數字出生日期碼,三位數字順序碼及一位數字校驗碼。
2.位址碼
表示編碼對象常住戶口所在縣(市、旗、區)的行政區劃代碼,依GB/T2260的規定執行。
3.出生日期碼
表示編碼物件出生的年、月、日,依GB/T7408的規定執行,年、月、日代碼之間不用分隔符號。
4.順序碼
表示在同一地址碼所標識的區域範圍內,對同年、同月、同日出生的人編定的順序號,順序碼的奇數分配給男性,偶數分配給女性。
5.校驗碼
根據前面十七位數字碼,依照ISO 7064:1983.MOD 11-2校驗碼計算出來的檢驗碼。
計算方法
1、將前面的身分證號碼17位數分別乘以不同的係數。從第一位到第十七位的係數分別為:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
2、將這17位數和係數相乘的結果相加。
3.用加出來和除以11,看餘數是多少?
4.餘數只可能有0-1-2-3-4-5-6-7-8-9-10這11個數字。其分別對應的最後一位身分證的號碼為1-0-X -9-8-7-6-5-4-3-2。
5.透過上面得知如果餘數是3,就會在身分證的第18位數上出現的是9。如果對應的數字是2,則身分證的最後一位號碼就是羅馬數字x。
例如:某男性的身分證號碼為【53010219200508011x】, 我們來看看這個身分證是不是合法的身分證。
首先我們得到前17位的乘積和【(5*7) (3*9) (0*10) (1*5) (0*8) (2*4) (1*2) (9*1) (2*6) (0*3) (0*7) (5*9) (0*10) (8*5) (0*8) (1*4) (1*2)】是189,然後用189除以11所得的結果是189/11=17----2,也就是說其餘數是2。最後透過對應規則就可以知道餘數2對應的檢驗碼是X。所以,可以判定這是一個正確的身分證號碼。
以上取自百度百科。
這個是網路上找到的相關資料圖片。
根據已知的資料,我們可以把這個方法的內部實作用js寫出來。前17位驗證比較容易實現,我就不多說了,重點講下最後一位的校驗碼。
// 身分證號驗證
function isIdCard(cardid) {
//身分證正規表示式(18位元)
var isIdCard2 = /^[1-9]d{5}(19d{2}|[2-9]d{3})((0d)|(1[0-2]))(([0|1 |2]d)|3[0-1])(d{4}|d{3}X)$/i;
var stard = "10X98765432"; //最後一位身分證的號碼
var first = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; //1-17係數
var sum = 0;
if (!isIdCard2.test(cardid)) {
return false;
}
var year = cardid.substr(6, 4);
var month = cardid.substr(10, 2);
var day = cardid.substr(12, 2);
var birthday = cardid.substr(6, 8);
if (birthday != dateToString(new Date(year '/' month '/' day))) { //校驗日期是否合法
return false;
}
for (var i = 0; i
sum = cardid[i] * first[i];
}
var result = sum % 11;
var last = stard[result]; //計算出來的最後一位身分證號碼
if (cardid[cardid.length - 1].toUpperCase() == last) {
return true;
} else {
return false;
}
}
//日期轉字串 回傳日期格式20080808
function dateToString(date) {
if (date instanceof Date) {
var year = date.getFullYear();
var month = date.getMonth() 1;
month = month
var day = date.getDate();
day = day
return year month day;
}
return '';
}
這裡只驗證18位身分證,15位元的一代身分證不能使用了。
這裡也驗證了日期的合法性,如0230,0431等非法日期,驗證是不會通過的。
我們也可以將這個方法加入jquery validate中,方便驗證使用。
寫個自訂jquery validate校驗方法
// 身分證字號驗證
jQuery.validator.addMethod("isIdCard",
function(value, element) {
return this.optional(element) || (isIdCard(value));
},
"身分證字號非法!");
來個簡的demo,看看效果如何。
身分證號驗證
標題>
http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js">
腳本>
http://www.w3cschool.cc/try/demo_source/static/js/jquery.validate.js">
腳本>
$(函數 () {
$("#form1").validate({
規則:{
txtIdCard: "isIdCard"
}
});
});
// 身分證號驗證
函數 isIdCard(cardid) {
//正表示式(18位元)
var isIdCard2 = /^[1-9]d{5}(19d{2}|[2-9]d{3})((0d)|(1[0-2]))(([0|1 |2]d)|3[0-1])(d{4}|d{3}X)$/i;
var stard = "10X98765432"; //最後一位身分證號碼
var sum = 0;
if (!isIdCard2.test(cardid)) {
回復錯誤;
}
var 年 = cardid.substr(6, 4);
var 月份 = cardid.substr(10, 2);
var day = cardid.substr(12, 2);
var 生日 = cardid.substr(6, 8);
if (birthday != dateToString(new Date(year '/' Month '/'day))) {//學校檢查日期是否合法
回復錯誤;
}
for (var i = 0; i
sum = cardid[i] * first[i];
}
var result = sum % 11;
var last = stard[result]; //計算的最後一位身分證號碼
if (cardid[cardid.length - 1].toUpperCase() == last) {
return true;
} else {
return alse;
}
}
//日期轉字串 回傳日期格式20080808
function dateToString(date) {
if (date instanceof Date) {
var year = date.getFullYear();
var month = date.getMonth() 1;
month = month
var day = date.getDate();
day = day
return year month day;
}
return '';
}
// jquery validate身分證號驗證
jQuery.validator.addMethod("isIdCard",
function (value, element) {
return this.optional(element) || (isIdCard(value));
},
"以身分證號為非法!");