保证测试通过的ip正则,antdIP/IP段的校验方法,antd的textArea中可以输入多个以换行分隔的ip/IP段,并自动检测出错行的原因
作者:互联网
ip正则:let ipRegex = /^(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|[1-9])\.((([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))))\.((([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))))\.((([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5])))))$/;
简单说明一下:网上的ip正则大部分都没有判断1.0.0.1或者1.01.01.02这种,可能他们默认这种一点分隔开的每一项都可以以0开头,而我们的测试不允许这样,所以我就稍加判断,像这种192.168.01.1这种的就无法通过,必须写成192.168.1.1这样的
再附上antd的自定义校验ip/ip段的方法 注:intl.get()此方法是antd项目中国际化的插件,阅读时可以忽略。
192.168.1.1
192.168.1.2/24
192.168.1.1-192.168.1.50
这些都是可以通过的
export function checkIp(rule, value, callback) {
if (!value) {
callback();
return;
}
// 如果有 - ,分开校验
if (value.indexOf('-') > -1) {
const ips = value.split('-');
for (let i = 0; i < ips.length; i++) { if (!ipRegex.test(ips[i])) { callback( intl.get('请输入正确的IP/IP段。例,192.168.1.1-192.168.1.50') ); return true; } }
// 校验前后2个ip的大小关系 const ip1Number = ip2number(ips[0]); const ip2Number = ip2number(ips[1]);
if (ip1Number >= ip2Number) { callback( intl.get('网段截止IP必须大于网段起始IP') ); }
} else if (value.indexOf('/') > -1) { const ips = value.split('/'); // 校验第一个 ip if (!ipRegex.test(ips[0])) { callback(intl.get('请输入正确的IP/IP段。例,192.168.1.2/24')); } // 校验子网掩码 if (!ips[1] || isNaN(ips[1])) { callback(intl.get('子网掩码范围是(0,32]。例,192.168.1.2/24')); } // 这里把 0 排除掉 if (ips[1] <= 0 || ips[1] > 32) { callback(intl.get('子网掩码范围是(0,32]。例,192.168.1.2/24')); } } else if (!ipRegex.test(value)) { callback(intl.get('请输入正确的IP/IP段')); }
callback(); }; 再附上antd的textArea中可以输入多个以换行分隔的ip/IP段,并自动检测出错行的原因的方法 export function checkTextAreaIp(rule, value, callback) { if (value) { const passArr = []; // 已经检查通过的IP const valueArr = value.split('\n');
try { Array.isArray(valueArr) && valueArr.forEach((ip, index) => { const lineText = intl.get("第n行[ip]", { num: index + 1, ip: ip }); if (!ip) { throw lineText + intl.get('扫描资产不能为空'); } // 校验去重 if (passArr.indexOf(ip) !== -1) { throw lineText + intl.get('已重复'); } // 如果有 - ,分开校验 if (ip.indexOf('-') > -1) { const ips = ip.split('-');
for (let i = 0; i < ips.length; i++) { if (!ipRegex.test(ips[i])) { throw lineText + intl.get('请输入正确的IP/IP段。例,192.168.1.1-192.168.1.50'); } }
// 校验前后2个ip的大小关系 const ip1Number = ip2number(ips[0]); const ip2Number = ip2number(ips[1]);
if (ip1Number >= ip2Number) { throw lineText + intl.get('网段截止IP必须大于网段起始IP'); }
} else if (ip.indexOf('/') > -1) { const ips = ip.split('/'); // 校验第一个 ip if (!ipRegex.test(ips[0])) { throw lineText + intl.get('请输入正确的IP/IP段。例,192.168.1.2/24'); } // 校验子网掩码 if (!ips[1] || isNaN(ips[1])) { callback(intl.get('子网掩码范围是(0,32]。例,192.168.1.2/24')); } // 这里把 0 排除掉 if (ips[1] <= 0 || ips[1] > 32) { throw lineText + intl.get('子网掩码范围是(0,32]。例,192.168.1.2/24'); } } else if (!ipRegex.test(ip)) { throw lineText + intl.get('请输入正确的IP/IP段'); }
passArr.push(ip); }) } catch (e) { callback(e); } finally { callback() } } else { callback(); } };
for (let i = 0; i < ips.length; i++) { if (!ipRegex.test(ips[i])) { callback( intl.get('请输入正确的IP/IP段。例,192.168.1.1-192.168.1.50') ); return true; } }
// 校验前后2个ip的大小关系 const ip1Number = ip2number(ips[0]); const ip2Number = ip2number(ips[1]);
if (ip1Number >= ip2Number) { callback( intl.get('网段截止IP必须大于网段起始IP') ); }
} else if (value.indexOf('/') > -1) { const ips = value.split('/'); // 校验第一个 ip if (!ipRegex.test(ips[0])) { callback(intl.get('请输入正确的IP/IP段。例,192.168.1.2/24')); } // 校验子网掩码 if (!ips[1] || isNaN(ips[1])) { callback(intl.get('子网掩码范围是(0,32]。例,192.168.1.2/24')); } // 这里把 0 排除掉 if (ips[1] <= 0 || ips[1] > 32) { callback(intl.get('子网掩码范围是(0,32]。例,192.168.1.2/24')); } } else if (!ipRegex.test(value)) { callback(intl.get('请输入正确的IP/IP段')); }
callback(); }; 再附上antd的textArea中可以输入多个以换行分隔的ip/IP段,并自动检测出错行的原因的方法 export function checkTextAreaIp(rule, value, callback) { if (value) { const passArr = []; // 已经检查通过的IP const valueArr = value.split('\n');
try { Array.isArray(valueArr) && valueArr.forEach((ip, index) => { const lineText = intl.get("第n行[ip]", { num: index + 1, ip: ip }); if (!ip) { throw lineText + intl.get('扫描资产不能为空'); } // 校验去重 if (passArr.indexOf(ip) !== -1) { throw lineText + intl.get('已重复'); } // 如果有 - ,分开校验 if (ip.indexOf('-') > -1) { const ips = ip.split('-');
for (let i = 0; i < ips.length; i++) { if (!ipRegex.test(ips[i])) { throw lineText + intl.get('请输入正确的IP/IP段。例,192.168.1.1-192.168.1.50'); } }
// 校验前后2个ip的大小关系 const ip1Number = ip2number(ips[0]); const ip2Number = ip2number(ips[1]);
if (ip1Number >= ip2Number) { throw lineText + intl.get('网段截止IP必须大于网段起始IP'); }
} else if (ip.indexOf('/') > -1) { const ips = ip.split('/'); // 校验第一个 ip if (!ipRegex.test(ips[0])) { throw lineText + intl.get('请输入正确的IP/IP段。例,192.168.1.2/24'); } // 校验子网掩码 if (!ips[1] || isNaN(ips[1])) { callback(intl.get('子网掩码范围是(0,32]。例,192.168.1.2/24')); } // 这里把 0 排除掉 if (ips[1] <= 0 || ips[1] > 32) { throw lineText + intl.get('子网掩码范围是(0,32]。例,192.168.1.2/24'); } } else if (!ipRegex.test(ip)) { throw lineText + intl.get('请输入正确的IP/IP段'); }
passArr.push(ip); }) } catch (e) { callback(e); } finally { callback() } } else { callback(); } };
标签:intl,get,IP,ips,192.168,测试通过,ip 来源: https://www.cnblogs.com/qq1170623178/p/11095161.html