身份证比较全的正则校验方法(react)
·
certificate(rule, value, callback, form) {
const provs = {
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: '国外',
};
let iSum = 0;
const type = form.getFieldValue('idType'); // 获取到证件类型
if (!type && value.replace(/\s+/g, '')) {
// 如果输入了证件号,校验证件类型
form.validateFields(['idType'], { force: true });
} else if (type && !value.replace(/\s+/g, '')) {
// 如果有证件号,校验证件类型
return Promise.reject('请输入证件号');
} else if (type && value.replace(/\s+/g, '')) {
switch (type) {
case 1:
if (!/^\d{17}(\d|x)$/i.test(value.replace(/\s+/g, ''))) {
return Promise.reject('输入的身份证长度或格式错误');
}
value = value.replace(/\s+/g, '').replace(/x$/i, 'a');
// eslint-disable-next-line radix
if (provs[parseInt(value.replace(/\s+/g, '').substr(0, 2))] == null) {
return Promise.reject('您的身份证地区非法');
}
// eslint-disable-next-line no-case-declarations
const isBirthday = `${value.replace(/\s+/g, '').substr(6, 4)}-${Number(
value.replace(/\s+/g, '').substr(10, 2),
)}-${Number(value.replace(/\s+/g, '').substr(12, 2))}`;
// eslint-disable-next-line no-case-declarations
const d = new Date(isBirthday.replace(/-/g, '/'));
if (isBirthday !== `${d.getFullYear()}-${d.getMonth() + 1}-${d.getDate()}`) {
return Promise.reject('输入的身份证上的出生日期非法');
}
// eslint-disable-next-line no-restricted-properties
for (let i = 17; i >= 0; i--)
iSum += (Math.pow(2, i) % 11) * parseInt(value.replace(/\s+/g, '').charAt(17 - i), 11);
if (iSum % 11 !== 1) {
return Promise.reject('你输入的身份证号非法');
}
break;
case 2:
if (!/^\d{8}(\d{2})?$/.test(value.replace(/\s+/g, '')))
return Promise.reject('台湾居民来往大陆通行证输入有误');
break;
case 3:
if (!/^(H|M)\d{8}$/.test(value.replace(/\s+/g, ''))) return Promise.reject('港澳居民来往内地通行证输入有误');
break;
default:
return Promise.resolve();
}
}
return Promise.resolve();
},
};
使用方式如下:
<FormItem
{...formLayout.formItemLayout}
label="证件号"
name="pati_id_number"
initialValue={pati_id_number}
rules={[
{ required, message: '必填项!' },
{
validator: (rule, value, callback) => validate.certificate(rule, value, callback, form)
}
]}
>
<Input
placeholder="证件号"
allowClear
disabled={status === '2'}
/>
</FormItem>
更多推荐


所有评论(0)