正则校验IP、IP-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])))))$/;
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 = "第{num}行[{ip}]", { num: index + 1, ip: ip });
                if (!ip) {
                    throw lineText + “不能为空”;
                }
                // 校验去重
                if (passArr.indexOf(ip) !== -1) {
                    throw lineText +"已重复";
                }
                // 如果有 - ,分开校验
                if (ip.indexOf('-') > -1) {
                    const ips = ip.split('-');

 

                    for (let i = 0; i < ips.length; i++) {
                        if (!ipRegex.test(ips[i])) {
                            throw lineText + '请输入正确的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 + '网段截止IP必须大于网段起始IP'
                    }

 

                } else if (ip.indexOf('/') > -1) {
                    const ips = ip.split('/');
                    // 校验第一个 ip
                    if (!ipRegex.test(ips[0])) {
                        throw lineText + '请输入正确的IP/IP段。例,192.168.1.2/24'
                    }
                    // 校验子网掩码
                    if (!ips[1] || isNaN(ips[1])) {
                        callback('子网掩码范围是(0,32]。例,192.168.1.2/24');
                    }
                    // 这里把 0 排除掉
                    if (ips[1] <= 0 || ips[1] > 32) {
                        throw lineText + '子网掩码范围是(0,32]。例,192.168.1.2/24';
                    }
                } else if (!ipRegex.test(ip)) {
                    throw lineText +请输入正确的IP/IP段
                }

 

                passArr.push(ip);
            })
        } catch (e) {
            callback(e);
        } finally {
            callback()
        }
    } else {
        callback();
    }
};
posted @ 2021-01-25 11:21  a茶色  阅读(543)  评论(0编辑  收藏  举报