/** * 正则/匹配 */ /** * 数字验证码 * @param value {Any} 值 */ function captcha(value: any) { const reg = /^\d{4,6}$/; return (reg.test(value)); } /** * 图片验证码 * @param value {Any} 值 */ function imageCode(value: any) { const reg = /^[a-zA-Z0-9]{4}/; return reg.test(value) && value.length === 4; } /** * 检测正整数 * @param value {Any} 值 */ function positiveInteger(value: any) { const reg = /^\+?[1-9]\d*$/; return reg.test(value); } /** * 检测邮箱 * @param value {Any} 值 */ function email(value: any) { if (value.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1) { return true; } else { return false; } } /** * 检测输入是否是IP格式 * @param value {Any} 值 */ function ip(value: any) { const reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])(\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$/; return reg.test(value); } /**检测网段的格式是否正确 * @param value {Any} 值 */ function checkNetwork(value: any) { if (!value) { return false; } let arr = value.split('/'); // if (!this.isValidIP(arr[0]) || arr.length > 2) { // 验证193.55.44.22或者192.168.2/26 if (!ip(arr[0]) || arr.length !== 2) { // 验证192.168.2/26 return false; } let reg = /^(0|[1-9][0-9]{0,1})$/; if ((arr.length === 2 && !reg.test(arr[1])) || (arr.length === 2 && arr[1] < 0) || (arr.length === 2 && arr[1] > 32)) { return false; } if (arr.length === 2) { let netArr = arr[0].split('.'); for (let i = 0; i < netArr.length; i++) { if (!checkNetByByte(netArr[i], i + 1, arr[1])) { return false; } } } return true; } /**验证网段某个字节是否正确,主要是配合上面checkNetwork的方法使用,true正确,false错误 * @param val {Any} 网段 如192.168.55.2/31 * @param num {Any} 第几字节 如192.168.55.2/31,第一字节是192,第一字节是168,第一字节是55,第一字节是2 * @param netmask网段掩码长度 {Any} 如192.168.55.2/31,网段掩码长度是31 */ function checkNetByByte(val: any, num: any, netmask: any) { let byte = Math.floor(netmask / 8); // 向下取整 let bit = netmask % 8; // 求余 let min = 0; let max = 255; let reg = /^[0-9]*$/; if (!reg.test(val) || val < 0 || val > 255) { // 输入的不是数字,默认重置为最小值0 return false; } val = Number(val); if (byte >= num) { // 掩码位数超过输入框的位数,则该输入框输入范围为:0-255 return true; } // 介于输入框范围:计算输入框输入范围 let divisor = Math.pow(2, 8 - bit); if (val % divisor !== 0) { return false; } return true; } /** * 企业名称 * @param value {Any} 值 */ function companyName(value: any) { const reg = /^[a-zA-Z0-9\u4E00-\u9FA5\(\)\(\)\s]+$/; return (reg.test(value)); } /** * 组织机构/社会信用代码 * @param value {Any} 值 */ function institutionCode(value: any) { return (organizationCode(value) || socialCreditCode(value)); } /** * 组织机构代码 * @param {value} 验证10位(xxxxxxxx-x)组织机构方法:true-正确,false-错误 */ function organizationCode(value: any) { if (value != '') { let values = value.split('-'); let ws = [3, 7, 9, 10, 5, 8, 4, 2]; let str = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; let reg = /^([0-9A-Z]){8}-[0-9|X]$/; if (!reg.test(value)) { return false; } let sum = 0; for (let i = 0; i < 8; i++) { sum += str.indexOf(values[0].charAt(i)) * ws[i]; } let C9 = (11 - (sum % 11)) + ''; let YC9 = values[1] + ''; if (C9 == '11') { C9 = '0'; } else if (C9 == '10') { C9 = 'X'; } else { C9 = C9 + ''; } return YC9 == C9; } } /** * 社会信用代码 * @param value {Any} 值 * 验证统一社会信用代码:true-正确,false-错误 * 统一代码由十八位的阿拉伯数字或大写英文字母(不使用I、O、Z、S、V)组成。 * 第1位:登记管理部门代码(共一位字符) * 第2位:机构类别代码(共一位字符) * 第3位~第8位:登记管理机关行政区划码(共六位阿拉伯数字) * 第9位~第17位:主体标识码(组织机构代码)(共九位字符) * 第18位:校验码​(共一位字符) */ function socialCreditCode(value: any) { let regName = /^(11|12|13|19|51|52|53|59|91|92|93|Y1)\d{6}[0-9A-Z]{10}$/; // 18位校验及大写校验,1~8位严格验证 if ((value.length !== 18) || !regName.test(value)) { return false; } let orgCode = value.substring(8, 16) + '-' + value.substring(16, 17); // 第9位~第17位:组织机构代码 if (!organizationCode(orgCode)) { return false; } // 验证组织机构代码 // 验证最后一位校验码 let ws = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28]; // 加权因子 let str = '0123456789ABCDEFGHJKLMNPQRTUWXY'; // 不用I、O、S、V、Z let sum = 0; for (let i = 0; i < 17; i++) { sum += str.indexOf(value.charAt(i)) * ws[i]; } let C18 = 31 - (sum % 31); if (C18 === 31) { C18 = 0; } let C18_str = str.substring(C18, C18 + 1); let YC18 = value.substring(17, 18); // 第18位 return YC18 === C18_str; } /** * 邮政编码 * @param value {Any} 值 */ function postalCode(value: any) { const reg = /^[1-9][0-9]{5}$/; return reg.test(value); } /** * 地址 * @param value {Any} 值--判断地址:不能为空,不能为纯空格字符,不能为纯数字 */ function address(value: any) { let regNumAll = /^[0-9]*$/; let newStr = !value ? value : value.replace(/\s+/g, ''); return !!newStr && !regNumAll.test(newStr); } /** * 真实姓名 * @param value {Any} 值 */ function name(value: any) { const reg = /^[\u4E00-\u9FA5]+$/; return (reg.test(value)); } /** * 护照证件 * @param value {Any} 值 */ function passport(value: any) { const reg = /^[a-zA-Z0-9]{5,17}$/; return (reg.test(value)); } /** * 手机号码 * @param value {Any} 值 */ function phone(value: any) { const reg = /^0?1[3|4|5|6|7|8|9][0-9]\d{8}$/; return reg.test(value); } /** * 密码规则 * @param value {Any} 值 */ function password(value: any) { const reg = /(?!^([0-9]+|[a-zA-Z]+|[()`~!@#$%^&*\\-_+=|{}\[\]:;'<>,.?\/]+)$)^[\w()`~!@#$%^&*\\-_+=|{}\[\]:;'<>,.?\/]{8,32}$/g; return reg.test(value); }; /** * 数字,字母大小写,特殊字符 * @param {string} value 密码 */ function fourPassword(value: any) { let reg = /^(?!^([0-9]+|[a-zA-Z]+|[!@#$%^&*()_+-=]+)$)(?![a-zA-Z0-9]+$)(?![a-z0-9!@#$%^&*()_+-=]+$)(?![A-Z0-9!@#$%^&*()_+-=]+$)[a-zA-Z0-9!@#$%^&*()_+-=]{8,32}$/g return reg.test(value); } /** * 金钱正则--正整数且最多两位小数 * @param value */ function money(value: any) { let reg = /^(([1-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/; return reg.test(value) } /** * 全等比较 * @param obj1 * @param obj2 */ function objEqual(obj1: any, obj2: any) { if (JSON.stringify(obj1) === JSON.stringify(obj2)) { return true } else { return false } } /**验证后端服务器权重,true正确,false错误*/ function weight(val: any) { let reg = /^[0-9]*$/; if (!reg.test(val) || val <= 0 || val > 100) { // 输入的不是数字,默认重置为最小值0 return false; } return true; } /**验证后端服务器端口号,true正确,false错误 */ function port(val: any) { let reg = /^[0-9]*$/; if (!reg.test(val) || val < 1 || val > 65535) { // 输入的不是数字,默认重置为最小值0 return false; } return true; } // 身份证验证 todo 有待修改 function identityCodeValid(idCode:any) { let code = idCode.toUpperCase(); let city:any = { 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 tip = ''; let pass = true; if (!code || !/^\d{6}(18|19|20)?\d{2}([0-1][0-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/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) //加权因子 let factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; //校验位 let 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 = code[i]; wi = factor[i]; sum += ai * wi; } let last = parity[sum % 11]; if (parity[sum % 11] != code[17]) { //tip = '校验位错误'; pass = false; } } } return pass; } export default { captcha, // 验证码 imageCode, // 图片验证码 positiveInteger, // 正整数 email, // 邮箱 ip, // 输入是否是IP格式 companyName, // 公司名称 institutionCode, // 组织机构/社会信用代码 postalCode, // 邮政编码 address, // 地址 name, // 真实姓名 passport, // 护照证件 phone, // 手机号码 password, // 密码规则 fourPassword, // 数字,字母大小写,特殊字符 objEqual, // 值全等比较 checkNetwork, // 网段格式 checkNetByByte, // 检测网段字节是否正确 money, weight, // 权重 port, // 端口 identityCodeValid, // 身份证认证 }