// 非必填项 多个 IP地址校验正则函数
var validatorIp = (rule, value, callback) => {
// multicast_type为0 '任意源'时 没有信源IP校验,跳过所有IP校验
if (this.form.multicast_type === 0) {
return callback();
}
// multicast_type不为0时,开始执行IP校验逻辑
if (!value) {
return callback('信源IP不能为空');
}
// 定义IPv4地址的正则校验规则
const ipRegex = /^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$/;
// 按逗号分割IP组,同时去除每组首尾空格
const ipGroups = value.split(',').map(ip => ip.trim());
// 校验IP组数量,最多20组
if (ipGroups.length > 20) {
return callback(new Error('最多支持20组IP地址'));
}
// 检查是否有空值分组
if (ipGroups.some(ip => !ip)) {
// return callback(new Error('请输入正确的IP地址,多个IP用逗号","分隔'));
return callback(new Error('IP地址分组不能为空'));
}
// 通过Set去重判断是否存在重复IP
/* const uniqueIps = new Set(ipGroups);
if (uniqueIps.size !== ipGroups.length) {
return callback(new Error('IP地址不能重复'));
} */
const validIps = [];// 有效的IP地址
const duplicateIps = [];// 重复的ip
const seenIps = new Set();// 创建一个Set数据结构来跟踪已经处理过的IP地址
// 遍历校验每个IP的格式合法性
for (const ip of ipGroups) {
if (!ipRegex.test(ip)) {
return callback(new Error('请输入正确的IP地址,多个IP用逗号","分隔'));
}
// 禁止输入0.0.0.0和255.255.255.255
if (ip === '0.0.0.0' || ip === '255.255.255.255') {
return callback(new Error('不允许输入0.0.0.0和255.255.255.255等特殊IP'));
}
// 检查重复
if (seenIps.has(ip)) {
duplicateIps.push(ip);
} else {
seenIps.add(ip);
validIps.push(ip);
}
}
if (duplicateIps.length > 0) {
return callback(`发现重复IP地址: ${[...new Set(duplicateIps)].join(', ')}`);
}
// 校验通过
return callback();
};