You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
function check(val){
var reg=/^[1-9]\d{5}(19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|(10|20|30|31))\d{3}[0-9Xx]$/;
return reg.test(val);
}
检测省份码
function checkProvice(val)
{
var patten=/^[1-9][0-9]/;
if(patten.test(val))
{
var prov={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",51:"四川",52:"贵州",53:"云南",54:"西藏",50:"重庆",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",81:"香港",82:"澳门",83:"台湾"};
if(prov[val])
{
return true;
};
}
return false;
}
检测出生日期
function checkBirthDay(val)
{
var patten=/^(19|20)\d{2}((0[1-9])|1[0-2])(([0-2][1-9])|(10|20|30|31))/;
if(patten.test(val))
{
var year=val.substring(0,4);
var month=val.substring(4,6);
var day=val.substring(6,8);
var date=new Date(year+"-"+month+"-"+day);
if(date&&date.getMonth()==(parseInt(month)-1))
{
return true;
}
}
return false;
}
检测校验码
function checkVerifyCode(val)
{
var patten=/^[1-9]\d{5}(19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|(10|20|30|31))\d{3}[0-9X]$/;
var ratio=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
var codeArr=[1,0,"X",9,8,7,6,5,4,3,2];
var code=val.substring(17);
if(patten.test(val))
{
var sum=0;
for(var i=0;i<17;i++)
{
sum+=val[i]*ratio[i];
}
console.log(sum)
var remainder=sum%11;
if(codeArr[remainder]==code)
{
return true;
}
}
return false;
}
function checkIndetityCardNo(val){
var province=val.substring(0,2);
if(checkProvice(province))
{
var date=val.substring(6,14);
if(checkBirthDay(date))
{
return checkVerifyCode(val);
}
}
return false;
}
AricZhu, getanimation, IsKaros, jinweiya0507, NARUTOne and 17 moreLancelotSakiCoderLeiShuo
Activity
qingleizhang123 commentedon May 6, 2019
分析:身份证号码的组成:地址码6位+年份码4位+月份码2位+日期码2位+顺序码3位+校验码1位
myprelude commentedon Jun 13, 2019
不是很清楚 身份证号码的规则 写不出来正则
Konata9 commentedon Jul 11, 2019
wyx2014 commentedon Jul 25, 2019
seho-dev commentedon Aug 5, 2019
这个不清楚规则
15190408121 commentedon Sep 1, 2019
不太清楚规则
var reg=/^[1-9]\d{5}(19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|(10|20|30|31))\d{3}[0-9Xx]$/;
reg.test(val);
还是贴个上面的答案把
giggleCYT commentedon Jun 21, 2020
smile-2008 commentedon Sep 18, 2020
粗暴型: 只考虑位数、最后的 x \d{17}[\dXx]
一般型:
前 6 位区号 \d{6}
中间年份 \d{4} 可以增加年份判断
月份 01-12 月 0[1-9]|1[0-2]
日期 01-31 日 0[1-9]|[12][0-9]|3[01]
顺序码 \d{3}
校验码 [\dXx] 其实有校验算法,可以根据算法再做一次检查 https://zhuanlan.zhihu.com/p/21286417
const isValidIdentity = (id) => {
if (
/^\d{6}\d{4}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])\d{3}[\dXx]$/.test(id)
) {
return true;
} else {
return false;
}
};
console.log(isValidIdentity(123456789012345678));
console.log(isValidIdentity(123456190011301234));
console.log(isValidIdentity("123456190013301234"));
console.log(isValidIdentity("123456190010321234"));
console.log(isValidIdentity('12345619001130123x'));
console.log(isValidIdentity('12345619001130123X'));
phx-26 commentedon Dec 2, 2020
还有15位的身份证。。。
amikly commentedon Nov 7, 2021
github-cxtan commentedon Feb 18, 2022
简易写法
function IsUserID(data){
let reg = /\d{17}[\dXx]/g;
return reg.test(data);
}
xiaoqiangz commentedon May 27, 2022
mark一下。