## 验证身份证格式
>[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判断是否为空