## 驗證身份證格式
>[info] #### 很多時候,我們需要在JS當中去驗證用戶輸入身份證格式是否正確
代碼如下:
```
/**
* 根據〖中華人民共和國國家標準 GB 11643-1999〗中有關公民身份號碼的規定,公民身份號碼是特征組合碼,由十七位數字本體碼和一位數字校驗碼組成。排列順序從左至右依次為:六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。
* 地址碼表示編碼對象常住戶口所在縣(市、旗、區)的行政區劃代碼。
* 出生日期碼表示編碼對象出生的年、月、日,其中年份用四位數字表示,年、月、日之間不用分隔符。
* 順序碼表示同一地址碼所標識的區域范圍內,對同年、月、日出生的人員編定的順序號。順序碼的奇數分給男性,偶數分給女性。
* 校驗碼是根據前面十七位數字碼,按照ISO 7064:1983.MOD 11-2校驗碼計算出來的檢驗碼。
* 出生日期計算方法。
* 15位的身份證編碼首先把出生年擴展為4位,簡單的就是增加一個19或18,這樣就包含了所有1800-1999年出生的人;
* 2000年后出生的肯定都是18位的了沒有這個煩惱,至于1800年前出生的,那啥那時應該還沒身份證號這個東東,⊙﹏⊙b汗...
* 下面是正則表達式:
* 出生日期1800-2099 (18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])
* 身份證正則表達式 /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i
* 15位校驗規則 6位地址編碼+6位出生日期+3位順序號
* 18位校驗規則 6位地址編碼+8位出生日期+3位順序號+1位校驗位
* 校驗位規則 公式:∑(ai×Wi)(mod 11)……………………………………(1)
* 公式(1)中:
* i----表示號碼字符從由至左包括校驗碼在內的位置序號;
* ai----表示第i位置上的號碼字符值;
* Wi----示第i位置上的加權因子,其數值依據公式Wi=2^(n-1)(mod 11)計算得出。
* i 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
* Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
* ============================================================================================
* 身份證號合法性驗證
* 支持15位和18位身份證號
* 支持地址編碼、出生日期、校驗位驗證
* @param code
* @returns {*[]} 該函數返回一個數組 [true,''] 或 [false,"身份證號格式錯誤"]
* @constructor
*/
function IdentityCodeValid(code) {
var city={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:"國外 "};
var tip = "";
var pass= true;
if(!code || !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|[xX])$/i.test(code)){
tip = "身份證號格式錯誤";
pass = false;
}
else if(!city[code.substr(0,2)]){
tip = "地址編碼錯誤";
pass = false;
}
else{
//18位身份證需要驗證最后一位校驗位
if(code.length == 18){
code = code.split('');
//∑(ai×Wi)(mod 11)
//加權因子
var factor = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ];
//校驗位
var parity = [ 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 ];
var sum = 0;
var ai = 0;
var wi = 0;
for (var i = 0; i < 17; i++)
{
ai = code[i];
wi = factor[i];
sum += ai * wi;
}
var last = parity[sum % 11];
if(parity[sum % 11] != code[17]){
tip = "校驗位錯誤,結尾是字母請注意大小寫";
pass =false;
}
}
}
// if(!pass) alert(tip);
//return pass;
return [pass,tip]
}
```
調用方法:
```
IdentityCodeValid("110000198304102033");
```
- 序章
- 一、JS生成隨機字符串
- 二、JS生成UUID
- 三、JS驗證手機格式
- 四、JS驗證身份證格式
- 五、JS判斷兩個數組是否相等
- 六、JS格式化金額
- 七、JS數組去重
- 八、JS打亂數組
- 九、JS數組冒泡排序
- 十、JS字符串長度截取
- 十一、JS判斷是否以某個字符串開頭
- 十二、JS判斷是否以某個字符串結束
- 十三、JS判斷是否為數字類型
- 十四、JS設置cookie和獲取cookie
- 十五、JS完美判斷是否為網址
- 十六、JS獲取頁面高度
- 十七、JS隨機數時間戳
- 十八、JS日期格式化函數
- 十九、JS時間個性化輸出功能
- 二十、JS判斷是否是中文名
- 二十一、JS獲取地址欄參數的值
- 二十二、JS字符串反序
- 二十三、JS現金額轉大寫
- 二十四、JS允許輸入小數位的數字
- 二十五、JS限制只能是整數
- 二十六、JS檢測字符串是否為空
- 二十七、JS將數值四舍五入到保留的小數位數
- 二十八、切割相應小數點后位數,并將小數點后多余的0 清空
- 二十九、JS判斷是否是郵箱的正確格式
- 三十、JS將手機號格式化,中間部分以 * 號代替
- 三十一、JS銀行卡卡號格式判斷
- 三十二、JS檢查用戶名是否滿足要求,只能是英文或英文數字
- 三十三、JS驗證密碼,必須是字母和數字結合
- 三十四、JS檢查輸入的郵政編碼是否正確
- 三十五、JS驗證是否為正整數
- 三十六、JS判斷是否包含全角
- 三十七、JS檢查輸入的一串字符是否全部是數字
- 三十八、JS檢查輸入的一串字符是否全部是數字或者英文
- 三十九、JS檢查輸入的一串字符是否全部是數字或者英文或半角-或者空格
- 四十、JS檢查輸入的一串字符是否全部是英文
- 四十一、JS檢查輸入的一串字符是否為小數
- 四十二、JS檢查輸入的字符是否具有特殊字符
- 四十三、JS驗證是否為網址
- 四十四、JS將數字轉換成字符串的通用方法
- 四十五、JS判斷瀏覽器
- 四十六、JS手機類型判斷
- 四十七、JS判斷是否支持css3
- 四十八、JS替換非法字符
- 四十九、JS獲取當前時間
- 五十、JS獲取前num天的日期
- 五十一、JS獲取到 days 天后的秒數
- 五十二、JS生成從minNum到maxNum的隨機整數
- 五十三、JS XSS字符轉義
- 五十四、JS 將object轉為form data,方便post提交
- 五十五、JS將駝峰字符串轉為下劃線字符串
- 五十六、JS檢測是否支持transition
- 五十七、JS數據求交集
- 五十八、JS base64字符串編碼與解碼
- 五十九、JS判斷兩個數組是否相等
- 六十、JS格式化${startTime}距現在的已過時間
- 六十一、JS格式化現在距${endTime}的剩余時間
- 六十二、JS Url參數轉對象
- 六十三、JS過濾字符串中所有空格
- 六十四、JS在字符串中查找某一字符串出現的次數
- 六十五、JS從數組中隨機獲取元素
- 六十六、JS適配rem
- 六十七、JS忽略大小寫判斷字符串是否相同
- 六十八、JS根據文件名獲取文件格式
- 六十九、JS校驗Ip地址格式
- 七十、JS生成指定位數的隨機整數
- 七十一、JS判斷包含關系
- 七十二、JS時間戳轉成時間
- 七十三、JS判斷是否為空