使用JS 校驗15或18位身份證的合法性以及得到所屬地區,出生日期,性別

/**

*?身份證15位編碼規則:dddddd?yymmdd?xx?p

*?dddddd:地區碼

*?yymmdd:?出生年月日

*?xx:?順序類編碼,無法確定

*?p:?性別,奇數為男,偶數為女

*?

*?身份證18位編碼規則:dddddd?yyyymmdd?xxx?y

*?dddddd:地區碼

*?yyyymmdd:?出生年月日

*?xxx:順序類編碼,無法確定,奇數為男,偶數為女

*?y:?校驗碼,該位數值可通過前17位計算獲得

*?

*?18位號碼加權因子為(從右到左)?wi?=?[?7,?9,?10,?5,?8,?4,?2,?1,?6,?3,?7,?9,?10,?5,?8,?4,?2,1?]

*?驗證位?Y?=?[?1,?0,?10,?9,?8,?7,?6,?5,?4,?3,?2?]

*?校驗位計算公式:Y_P?=?mod(?∑(Ai×wi),11?)

*?i為身份證號碼從右往左數的?2...18?位;?Y_P為校驗碼所在校驗碼數組位置

*

*/

//?加權因子

varwi?=?[7,?9,?10,?5,?8,?4,?2,?1,?6,?3,?7,?9,?10,?5,?8,?4,?2,?1];

//?身份證驗證位值.10代表X

varvalideCodeArr?=?[1,?0,?10,?9,?8,?7,?6,?5,?4,?3,?2];

//?區域ID

varareaMap?=?{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:"國外"};

//?男女ID

varsexMap?=?{0:"女",1:"男"};

//錯誤信息

varstatus?=newArray("true","身份證號碼位數不對!","身份證號碼出生日期超出范圍或含有非法字符!","身份證號碼校驗錯誤!","身份證地區非法!");

/**

*?驗證ID,正確返回“true”,錯誤則返回錯誤信息

*?@param?{Object}?idCard

*/

functioncheckIdCard(idCard){

//去掉首尾空格

idCard?=?trim(idCard.replace(/?/g,""));

if(idCard.length?==?15||idCard.length?==?18)?{

if(!checkArea(idCard))?{

returnstatus[4];

}elseif(!checkBrith(idCard)){

returnstatus[2];

}elseif(idCard.length?==?18?&&?!check18Code(idCard)){

returnstatus[3];

}else{

returnstatus[0];

}

}else{

//不是15或者18,位數不對

returnstatus[1];

}

}

/**

*?顯示解析出的信息

*?@param?{Object}?idCard?正確的ID號

*?@param?{Object}?sexId?性別要顯示的Input的id

*?@param?{Object}?birthId?生日要顯示的Input的id

*?@param?{Object}?areaId?地區要顯示的Input的id

*/

functionshowIDInfo(idCard,areaId,sexId,?birthId){

//?對身份證號碼做處理。包括字符間有空格。

idCard?=?trim(idCard.replace(/?/g,""));

//?性別

$("#"+sexId).val(getSex(idCard));

//?地區

$("#"+areaId).val(getArea(idCard));

//生日

$("#"+birthId).val(getBirthday(idCard));

}

/**

*?得到地區碼代表的地區

*?@param?{Object}?idCard?正確的15/18位身份證號碼

*/

functiongetArea(idCard){

returnareaMap[parseInt(idCard.substr(0,?2))];

}

/**

*?通過身份證得到性別

*?@param?idCard?正確的15/18位身份證號碼

*?@return?女、男

*/

functiongetSex(idCard){

if(idCard.length?==?15)?{

returnsexMap[idCard.substring(14,?15)?%?2];

}elseif(idCard.length?==?18)?{

returnsexMap[idCard.substring(14,?17)?%?2];

}else{

//不是15或者18,null

returnnull;

}

}

/**

*?得到生日"yyyy-mm-dd"

*?@param?{Object}?idCard?正確的15/18位身份證號碼

*/

functiongetBirthday(idCard){

varbirthdayStr;

if(15?==?idCard.length)?{

birthdayStr?=?idCard.charAt(6)?+?idCard.charAt(7);

if(parseInt(birthdayStr)?<?10)?{

birthdayStr?='20'+?birthdayStr;

}else{

birthdayStr?='19'+?birthdayStr;

}

birthdayStr?=?birthdayStr?+'-'+?idCard.charAt(8)?+?idCard.charAt(9)?+'-'+?idCard.charAt(10)?+?idCard.charAt(11);

}elseif(18?==?idCard.length)?{

birthdayStr?=?idCard.charAt(6)?+?idCard.charAt(7)?+?idCard.charAt(8)?+?idCard.charAt(9)?+'-'+?idCard.charAt(10)?+?idCard.charAt(11)?+'-'+?idCard.charAt(12)?+?idCard.charAt(13);

}

returnbirthdayStr;

}

/**

*?驗證身份證的地區碼

*?@param?{Object}?idCard?身份證字符串

*/

functioncheckArea(idCard){

if(areaMap[parseInt(idCard.substr(0,?2))]?==null){

returnfalse;

}else{

returntrue;

}

}

/**

*?驗證身份證號碼中的生日是否是有效生日

*?@param?idCard?身份證字符串

*?@return

*/

functioncheckBrith(idCard){

varresult?=true;

if(15?==?idCard.length)?{

varyear?=?idCard.substring(6,?8);

varmonth?=?idCard.substring(8,?10);

varday?=?idCard.substring(10,?12);

vartemp_date?=newDate(year,?parseFloat(month)?-?1,?parseFloat(day));

//?對于老身份證中的你年齡則不需考慮千年蟲問題而使用getYear()方法

if(temp_date.getYear()?!=?parseFloat(year)?||?temp_date.getMonth()?!=?parseFloat(month)?-?1?||?temp_date.getDate()?!=?parseFloat(day))?{

result?=false;

}

}elseif(18?==?idCard.length)?{

varyear?=?idCard.substring(6,?10);

varmonth?=?idCard.substring(10,?12);

varday?=?idCard.substring(12,?14);

vartemp_date?=newDate(year,?parseFloat(month)?-?1,?parseFloat(day));

//?這里用getFullYear()獲取年份,避免千年蟲問題

if(temp_date.getFullYear()?!=?parseFloat(year)?||?temp_date.getMonth()?!=?parseFloat(month)?-?1?||?temp_date.getDate()?!=?parseFloat(day))?{

result?=false;

}

}else{

result?=false;

}

returnresult;

}

/**

*?判斷身份證號碼為18位時最后的驗證位是否正確

*?@param?idCardArr?身份證號碼數組

*?@return

*/

functioncheck18Code(idCardArr){

varsum?=?0;//?聲明加權求和變量

if(idCardArr[17].toLowerCase()?=='x')?{

idCardArr[17]?=?10;//?將最后位為x的驗證碼替換為10方便后續操作

}

for(vari?=?0;?i?<?17;?i++)?{

sum?+=?wi[i]?*?idCardArr[i];//?加權求和

}

varvalCodePosition?=?sum?%?11;//?得到驗證碼所位置

if(idCardArr[17]?==?valideCodeArr[valCodePosition])?{

returntrue;

}else{

returnfalse;

}

}

//去掉字符串頭尾空格

functiontrim(str){

returnstr.replace(/(^\s*)|(\s*$)/g,"");

}

==================== 下面是頁面代碼 =====================

[html]view plaincopy

CordBirthday

function?validite(){

varid=?$("#idCard").val();

varresultstr=checkIdCard(id);

if?(resultstr==?"true")?{

showIDInfo(id,"area"?,"sex",?"birthday");

}?else?{

$('#sex').val("");

$('#birthday').val("");

$('#area').val("");

alert(resultstr);

}

}

身份證

地區

性別

生日

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,779評論 0 33
  • 一、 1、請用Java寫一個冒泡排序方法 【參考答案】 public static void Bubble(int...
    獨云閱讀 1,421評論 0 6
  • var regexEnum = { intege : "^-?[1-9]\\d*$", // 整數 intege1...
    nick2046閱讀 311評論 0 2
  • var regexEnum = { intege : "^-?[1-9]\\d*$", // 整數 intege1...
    a_foo閱讀 1,240評論 0 4
  • 1. 跟往常一樣,擠上回家的公交車,前門進不去,只能從后門擠上去。 不一樣的是,有一位老人在我們擠上去后數了下,上...
    安兒CC閱讀 137評論 0 0