实现一个输入框多个ip以逗号分隔最多20组,且ip不能重复

// 非必填项 多个 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 = /^((250-5|20-4\d|01?\d\d?)\.){3}(250-5|20-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();

};

相关推荐
看谷秀7 分钟前
arkts-10 实战
前端·arkts
范小兵8 分钟前
# DevEco CLI实战:鸿蒙App「至客」从0开发到正式上架
前端·harmonyos
SL_staff9 分钟前
插单风险的数据闭环治理:JVS-BI 在制造业实时预警中的技术实践
java·数据分析·数据可视化
半生过往22 分钟前
前端工程师学习智能体开发(一)
前端·学习·状态模式
白远山25 分钟前
健身场馆无人自动化解决方案:从架构到落地实践
java·开发语言·数据库·数据挖掘·需求分析
白雾茫茫丶28 分钟前
Vibecoding 一个主题切换动画库:13 种揭幕方式
前端·vue.js·react.js
计算机魔术师38 分钟前
谷歌宣布 TPU 互联架构支持 100 万芯片规模,电力供应成 AI 基建核心瓶颈
前端
user_admin_god42 分钟前
第 01 篇:OpenAI 兼容 API 初探 —— 用 curl 跑通第一次对话
java·人工智能·spring boot·语言模型·devops
雪芽蓝域zzs43 分钟前
第四十九节:TagsView 右键菜单(带三角箭头)给每个 tag 增加**鼠标右键菜单**(右键标签弹出:关闭、关闭其他、关闭全部)
前端·javascript·vue.js
曹牧1 小时前
PostMan:400 Bad Request‌
java