ykt-team-wxapp/utils/validate.js
2026-01-20 19:36:49 +08:00

222 lines
5.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const num = /^[0-9]*$/;
const mobile = /^1[3|4|5|6|7|8|9][0-9]\d{8}$/;
const email = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
const realName = /^[\u4e00-\u9fa5]{2,5}$/;
const num_en = /^[0-9a-zA-Z]{6,16}$/;
const name = /^\S{2,32}$/;
const identifyNumber = /^[a-zA-Z0-9]{1,20}$/;
const passwordRegExp = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,16}$/;
const idTransfer = (sId) => {
if (sId.length === 15) {
const arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2],
arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
let nTemp = 0;
sId = sId.substr(0, 6) + '19' + sId.substr(6, sId.length - 6);
for (let i = 0; i < 17; i++) {
nTemp += Number(sId.substr(i, 1)) * arrInt[i];
}
sId += arrCh[nTemp % 11];
}
return sId;
};
const validate = {
isPasswordValid: (str) => {
return passwordRegExp.test(str);
},
isNumber: (str) => {
return num.test(str);
},
isidentifyNumber: (str) => {
return identifyNumber.test(str);
},
//是否是手机
isMobile: (str) => {
return mobile.test(str);
},
//是否是邮件
isEmail: (str) => {
return email.test(str);
},
//是否是名字2-5中文
varisRealName: (str) => {
return realName.test(str);
},
//是否是数字加英文
isNumEn: (str) => {
return num_en.test(str);
},
// 2-32位字符
isName: (str) => {
return name.test(str);
},
//复杂的判定身份证
isChinaId: (s) => {
const sId = idTransfer(s),
aCity = {
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: '国外 '
};
if (!/^\d{17}(\d|x)$/i.test(sId)) {
return [false, '证件号格式错误'];
}
if (!aCity[parseInt(sId.substr(0, 2), 10)]) {
return [false, '身份证前两位错误'];
}
let sBirthday =
sId.substr(6, 4) +
'-' +
Number(sId.substr(10, 2)) +
'-' +
Number(sId.substr(12, 2));
const d = new Date(sBirthday.replace(/-/g, '/'));
if (
sBirthday !==
d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate()
) {
return [false, '非法身份证号'];
}
const sMouth = d.getMonth() + 1,
sDate = d.getDate();
sBirthday =
d.getFullYear() +
'-' +
(sMouth > 9 ? sMouth : '0' + sMouth) +
'-' +
(sDate > 9 ? sDate : '0' + sDate);
/*十八位身份证的校验码*/
// for (let i = 17; i >= 0; i--) {
// iSum += (Math.pow(2, i) % 11) * parseInt(sId.charAt(17 - i), 11);
// if ( iSum % 11 !== 1 ) {
// return [false,'非法身份证号'];
// }
// }
if (sId.length == 18) {
//∑(ai×Wi)(mod 11)
//加权因子
const factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
//校验位
const parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];
let sum = 0;
let ai = 0;
let wi = 0;
for (let i = 0; i < 17; i++) {
ai = Number(sId[i]);
wi = factor[i];
sum += ai * wi;
}
const last = parity[sum % 11];
if (last != sId[17].toUpperCase()) {
return [false, '非法身份证号'];
}
}
return [true, sBirthday, Number(sId.substr(16, 1)) % 2 ? 'MALE' : 'FEMALE'];
},
getAge: (identityCard) => {
const len = (identityCard + '').length;
if (len == 0) {
return 0;
} else {
if (len != 15 && len != 18) {
//身份证号码只能为15位或18位其它不合法
return 0;
}
}
let strBirthday = '';
if (len == 18) {
//处理18位的身份证号码从号码中得到生日和性别代码
strBirthday =
identityCard.substr(6, 4) +
'/' +
identityCard.substr(10, 2) +
'/' +
identityCard.substr(12, 2);
}
if (len == 15) {
strBirthday =
'19' +
identityCard.substr(6, 2) +
'/' +
identityCard.substr(8, 2) +
'/' +
identityCard.substr(10, 2);
}
//时间字符串里,必须是“/”
const birthDate = new Date(strBirthday);
const nowDateTime = new Date();
let age = nowDateTime.getFullYear() - birthDate.getFullYear();
const birthMonth = identityCard.substring(10, 12);
let month = nowDateTime.getMonth() - Number(birthMonth);
//再考虑月、天的因素;.getMonth()获取的是从0开始的这里进行比较不需要加1
if (
nowDateTime.getMonth() < birthDate.getMonth() ||
(nowDateTime.getMonth() == birthDate.getMonth() &&
nowDateTime.getDate() < birthDate.getDate())
) {
age--;
month = 12 + month;
}
return `${age}`;
},
noOtherStr(str) {
const pattern = new RegExp(
"[`~!@#$^&*()=|{}':;',\\[\\].<>/?~@#¥……&*()——|{}【】‘;:”“'。,、?%+_]"
);
let specialStr = '';
for (let i = 0; i < str.length; i++) {
specialStr += str.substr(i, 1).replace(pattern, '');
}
return specialStr;
}
};
export default validate;