判定是否为IPv4地址或范围

1.输入验证:判定是否为IPv4地址或范围.

/**
 * 判定是否IPv4地址或范围
 * 合法的格式有:
 * - IP地址: 172.21.34.12
 * - IP范围
 *   - IP段: 172.21.34.12-172.21.35.254,较大的必须在后面
 *   - CIDR表示: 172.21.34.12/16
 * @export
 * @param {string} value 值
 * @param {IPVersion} [version=4] 暂不支持IPv6格式
 * @return {*}  {boolean}
 * https://www.npmjs.com/package/validator
 */
import validator from 'validator'
import { isEmpty, trim, split } from 'lodash'

export function isIpOrIpRange(str, version = 4) {
  if (isEmpty(str) || isEmpty(trim(str))) {
    return false
  }
  if (validator.isIP(str, version) || validator.isIPRange(str, version)) {
    return true
  }
  const arr = split(str, '-')
  return (
    arr.length === 2 &&
    validator.isIP(arr[0], version) &&
    validator.isIP(arr[1], version) &&
    ipv4ToNumber(arr[0]) <= ipv4ToNumber(arr[1])
  )
}

/**
 * IPv4转整数
 * @param ip IPv4字符串
 * @returns
 */
export function ipv4ToNumber(ip) {
  if (!ip || !validator.isIP(ip, 4)) {
    throw new Error('无效的IPv4地址')
  }
  var result = 0
  ip.split('.').forEach(function(octet) {
    result <<= 8
    result += parseInt(octet)
  })
  return result >>> 0
}

//验证输入以逗号或换行分隔的ip段   (另:逗号和换行分隔,",\n"   "/,\n|,\r\n/g")
export function validIps(value) {
  const values = value.includes('\n') ? value.replace(/\n|\r\n/g, ',') : value
  const ipv4s = values.split(',')
  for (let item of ipv4s) {
    const valid = isIpOrIpRange(item)
    if (!valid) {
      return false
    }
  }
  return true
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值