js怎么校验以逗号分隔的多ip地址

在文本域中输入多个ip地址并已逗号分隔,怎么用js的正则表达式校验呢

阅读 7.8k
3 个回答

[修改(20170906:2109)] - 忘了 IP 段可以为 0,所以修改了下,现在范围是 0.0.0.0 ~ 255.255.255.255


先来验证一个 IP,每个 IP 分为 4 个段,每个段的规则如下

  1. 一位数,/[1-9]/
  2. 二位数,/[1-9]\d/
  3. 三位数,首位是 1,/1\d{2}/ 或者 /1\d\d/
  4. 三位数,首位是 2,第二位不是 5,/2[0-4]\d/
  5. 三位数,首位是 2,第二们是 5,/25[0-5]/

然后把这些规则用 | 组合起来,就是 IP 中的一段的验证规则

/[1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]/

四段组合成的 IP 是由一个上述的一段加三个带点号验证的一段,所以是

示意:/one(?:\.one){3}/,写出来就是

/(?:[0-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])(?:\.([0-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){3}/

逗号分隔的多个IP,那就是,每个前面是逗号(,)或起始标记(^),一共无数个……所以

/^(?:(?:^|,)(?:[0-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])(?:\.(?:[0-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){3})+$/

补充

说实在的,写正则确实痛苦,可以写个函数来解决,可能更容易懂也更不容易出错

function testIpList(ips) {
    // 把 ips 按逗号拆成 IP 数组,分别进行验证
    // every 表示每个 ip 验证通过才算通过
    return ips.split(",")
        .every(ip => {
            // 把每个 IP 拆成几段
            const segments = ip.split(".");
            // 如果是精确的 4 段而且每段转换成数字都在 1~255 就对了
            return segments.length === 4
                && segments
                    .map(segment => parseInt(segment, 10) || 0)
                    .every(n => n >= 0 && n <= 255);
        });
}

/(\d{1,3}\.){3}\d{1,3},?/g

/^((\d{1,3}\.){3}\d{1,3},)?(\d{1,3}\.){3}\d{1,3}$/g

const reg = /^((\d{1,3}\.){3}\d{1,3},)?(\d{1,3}\.){3}\d{1,3}$/g
reg.test('1.1.1.1,0.0.0.1')
// => true
reg.test('1.1.1.1,0.0.0.')
// => false
reg.test('1.1.1.1')
// => true
reg.test('1.1.1.1,')
// => false
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题