javascript驗(yàn)證身份證號(hào)
我們?cè)谧龌ヂ?lián)網(wǎng)網(wǎng)站時(shí),注冊(cè)個(gè)人資料時(shí),經(jīng)常要用到身份證號(hào),我們需要對(duì)身份證進(jìn)驗(yàn)證,不然別人隨便輸個(gè)號(hào)碼就通過,讓你感覺這個(gè)網(wǎng)站做得很shit。
身份證號(hào)是有規(guī)則的。
結(jié)構(gòu)和形式
1.號(hào)碼的結(jié)構(gòu)
公民身份號(hào)碼是特征組合碼,由十七位數(shù)字本體碼和一位校驗(yàn)碼組成。排列順序從左至右依次為:六位數(shù)字地址碼,八位數(shù)字出生日期碼,三位數(shù)字順序碼和一位數(shù)字校驗(yàn)碼。
2.地址碼
表示編碼對(duì)象常住戶口所在縣(市、旗、區(qū))的行政區(qū)劃代碼,按GB/T2260的規(guī)定執(zhí)行。
3.出生日期碼
表示編碼對(duì)象出生的年、月、日,按GB/T7408的規(guī)定執(zhí)行,年、月、日代碼之間不用分隔符。
4.順序碼
表示在同一地址碼所標(biāo)識(shí)的區(qū)域范圍內(nèi),對(duì)同年、同月、同日出生的人編定的順序號(hào),順序碼的奇數(shù)分配給男性,偶數(shù)分配給女性。
5.校驗(yàn)碼
根據(jù)前面十七位數(shù)字碼,按照ISO 7064:1983.MOD 11-2校驗(yàn)碼計(jì)算出來的檢驗(yàn)碼。
計(jì)算方法
1、將前面的身份證號(hào)碼17位數(shù)分別乘以不同的系數(shù)。從第一位到第十七位的系數(shù)分別為:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
2、將這17位數(shù)字和系數(shù)相乘的結(jié)果相加。
3、用加出來和除以11,看余數(shù)是多少?
4、余數(shù)只可能有0-1-2-3-4-5-6-7-8-9-10這11個(gè)數(shù)字。其分別對(duì)應(yīng)的最后一位身份證的號(hào)碼為1-0-X -9-8-7-6-5-4-3-2。
5、通過上面得知如果余數(shù)是3,就會(huì)在身份證的第18位數(shù)字上出現(xiàn)的是9。如果對(duì)應(yīng)的數(shù)字是2,身份證的最后一位號(hào)碼就是羅馬數(shù)字x。
例如:某男性的身份證號(hào)碼為【53010219200508011x】, 我們看看這個(gè)身份證是不是合法的身份證。
首先我們得出前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得出的結(jié)果是189/11=17----2,也就是說其余數(shù)是2。最后通過對(duì)應(yīng)規(guī)則就可以知道余數(shù)2對(duì)應(yīng)的檢驗(yàn)碼是X。所以,可以判定這是一個(gè)正確的身份證號(hào)碼。
以上摘自百度百科。
這個(gè)是網(wǎng)上找到的相關(guān)資料圖片。
根據(jù)已知的資料,我們可以把這個(gè)方法的內(nèi)部實(shí)現(xiàn)用js寫出來。前17位驗(yàn)證比較容易實(shí)現(xiàn),我就不多說了,重點(diǎn)講下最后一位的校驗(yàn)碼。
// 身份證號(hào)驗(yàn)證
function isIdCard(cardid) {
//身份證正則表達(dá)式(18位)
var isIdCard2 = /^[1-9]\d{5}(19\d{2}|[2-9]\d{3})((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])(\d{4}|\d{3}X)$/i;
var stard = "10X98765432"; //最后一位身份證的號(hào)碼
var first = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; //1-17系數(shù)
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))) { //校驗(yàn)日期是否合法
return false;
}
for (var i = 0; i < cardid.length - 1; i++) {
sum += cardid[i] * first[i];
}
var result = sum % 11;
var last = stard[result]; //計(jì)算出來的最后一位身份證號(hào)碼
if (cardid[cardid.length - 1].toUpperCase() == last) {
return true;
} else {
return false;
}
}
//日期轉(zhuǎn)字符串 返回日期格式20080808
function dateToString(date) {
if (date instanceof Date) {
var year = date.getFullYear();
var month = date.getMonth() + 1;
month = month < 10 ? '0' + month: month;
var day = date.getDate();
day = day < 10 ? '0' + day: day;
return year + month + day;
}
return '';
}
這里只驗(yàn)證18位身份證,15位的一代身份證不能使用了。
這里還驗(yàn)證了日期的合法性,如0230,0431等非法日期,驗(yàn)證是不會(huì)通過的。
我們還可以將這個(gè)方法加到j(luò)query validate中,方便驗(yàn)證使用。
寫個(gè)自定義jquery validate校驗(yàn)方法
// 身份證號(hào)驗(yàn)證
jQuery.validator.addMethod("isIdCard",
function(value, element) {
return this.optional(element) || (isIdCard(value));
},
"身份證號(hào)非法!");
來個(gè)簡(jiǎn)的demo,看看效果如何。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>
身份證號(hào)校驗(yàn)
</title>
<script src=" </script>
<script src=" </script>
<script type="text/javascript">
$(function () {
$("#form1").validate({
rules: {
txtIdCard: "isIdCard"
}
});
});
// 身份證號(hào)驗(yàn)證
function isIdCard(cardid) {
//身份證正則表達(dá)式(18位)
var isIdCard2 = /^[1-9]\d{5}(19\d{2}|[2-9]\d{3})((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])(\d{4}|\d{3}X)$/i;
var stard = "10X98765432"; //最后一位身份證的號(hào)碼
var first = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; //1-17系數(shù)
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))) {//校驗(yàn)日期是否合法
return false;
}
for (var i = 0; i < cardid.length - 1; i++) {
sum += cardid[i] * first[i];
}
var result = sum % 11;
var last = stard[result]; //計(jì)算出來的最后一位身份證號(hào)碼
if (cardid[cardid.length - 1].toUpperCase() == last) {
return true;
} else {
return false;
}
}
//日期轉(zhuǎn)字符串 返回日期格式20080808
function dateToString(date) {
if (date instanceof Date) {
var year = date.getFullYear();
var month = date.getMonth() + 1;
month = month < 10 ? '0' + month : month;
var day = date.getDate();
day = day < 10 ? '0' + day : day;
return year + month + day;
}
return '';
}
// jquery validate身份證號(hào)驗(yàn)證
jQuery.validator.addMethod("isIdCard",
function (value, element) {
return this.optional(element) || (isIdCard(value));
},
"身份證號(hào)非法!");
</script>
</head>
<body>
<form id="form1" method="get" action="">
<input type="text" id="txtIdCard" name="txtIdCard" />
<p>
<input class="submit" type="submit" value="提交" />
</p>
</form>
</body>
</html>
用百度百科上提供的那身份證號(hào)53010219200508011X驗(yàn)證下
驗(yàn)證能通過,把x換成0試試
校驗(yàn)不通過,我們寫的驗(yàn)證方法成功了!不信你用自己的身份證號(hào)試試。原來用js校驗(yàn)身份證號(hào)so easy。
以上就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
- JavaScript正則表達(dá)式驗(yàn)證身份證號(hào)碼是否合法(兩種方法)
- JS使用正則表達(dá)式驗(yàn)證身份證號(hào)碼
- Javascript使用正則驗(yàn)證身份證號(hào)(簡(jiǎn)單)
- JS支持帶x身份證號(hào)碼驗(yàn)證函數(shù)
- js實(shí)現(xiàn)二代身份證號(hào)碼驗(yàn)證詳解
- vbscript和javascript版的15位, 18位的身份證號(hào)碼的驗(yàn)證函數(shù).以及根據(jù)身份證取省份,生日,性別
- 15位和18位身份證JS校驗(yàn)的簡(jiǎn)單實(shí)例
- 如何用javascript正則表達(dá)式驗(yàn)證身份證號(hào)碼是否合法
- JS正則表達(dá)式完美實(shí)現(xiàn)身份證校驗(yàn)功能
- javascript身份證驗(yàn)證代碼
- JS實(shí)現(xiàn)的檢驗(yàn)身份證格式并輸出出生日期,年齡,性別,出生地示例
相關(guān)文章
js 顯示日期時(shí)間的實(shí)例(時(shí)間過一秒加1)
下面小編就為大家?guī)硪黄猨s 顯示日期時(shí)間的實(shí)例(時(shí)間過一秒加1)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10用javascript獲取當(dāng)頁(yè)面上鼠標(biāo)光標(biāo)位置和觸發(fā)事件的對(duì)象的代碼
用 javascript 獲取當(dāng)頁(yè)面上鼠標(biāo)(光標(biāo))位置 和 觸發(fā)事件的對(duì)象 的方法2009-12-12js對(duì)url進(jìn)行編碼解碼的三種方式總結(jié)
為一個(gè)字符串進(jìn)行URL編碼很容易,只需要調(diào)用encodeURI,傳入要編碼的字符串即可,而且實(shí)現(xiàn)的方法不止這一個(gè),下面這篇文章主要給大家介紹了關(guān)于js對(duì)url進(jìn)行編碼解碼的三種方式,需要的朋友可以參考下2023-02-02nestjs實(shí)現(xiàn)圖形校驗(yàn)和單點(diǎn)登錄的示例代碼
本文主要介紹了nestjs實(shí)現(xiàn)圖形校驗(yàn)和單點(diǎn)登錄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05微信小程序頁(yè)面跳轉(zhuǎn)功能之從列表的item項(xiàng)跳轉(zhuǎn)到下一個(gè)頁(yè)面的方法
這篇文章主要介紹了微信小程序頁(yè)面跳轉(zhuǎn)功能之從列表的item項(xiàng)跳轉(zhuǎn)到下一個(gè)頁(yè)面的方法,結(jié)合具體實(shí)例形式總結(jié)分析了微信小程序頁(yè)面跳轉(zhuǎn)及列表item項(xiàng)跳轉(zhuǎn)頁(yè)面的相關(guān)操作技巧,需要的朋友可以參考下2017-11-11JS實(shí)現(xiàn)簡(jiǎn)單路由器功能的方法
這篇文章主要介紹了JS實(shí)現(xiàn)簡(jiǎn)單路由器功能的方法,基于javascript模擬簡(jiǎn)單路由編碼的相關(guān)技巧,需要的朋友可以參考下2015-05-05setTimeout()遞歸調(diào)用不加引號(hào)出錯(cuò)的解決方法
用了setTimeout()想實(shí)現(xiàn)遞歸調(diào)用,如果第一個(gè)參數(shù)不加引號(hào)的話,就會(huì)出錯(cuò),下面與大家分享下該如何解決2014-09-09JavaScript設(shè)置、獲取、清除單值和多值cookie的方法
cookie 是存儲(chǔ)于訪問者的計(jì)算機(jī)中的變量。每當(dāng)同一臺(tái)計(jì)算機(jī)通過瀏覽器請(qǐng)求某個(gè)頁(yè)面時(shí),就會(huì)發(fā)送這個(gè) cookie。你可以使用 JavaScript 來創(chuàng)建和取回 cookie 的值,本文通過一段代碼給大家介紹js設(shè)置、獲取、清除單值和多值cookie的方法,需要的朋友一起學(xué)習(xí)吧2015-11-11