js 校验ip和ipv6组合正则

/**
 * Created by (laoshi) on 2020/08/14.
 */

export function validPassword(str) {
  var pwdRegex = new RegExp('(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[^a-zA-Z0-9]).{8,30}')
  if (!pwdRegex.test(str)) {
    return false
  }
  return true
}

export function checkValidate(value, type, callback) {
  if (value === '' || value === undefined || value === null) return callback()
  if (type === '' || type === undefined || type === null) return callback()

  value = value.replace(/,/ig, ',')

  const arr = value.split(',')

  if (arr === null || arr.length === 0) return '输入校验字符'
  for (var i = 0; i < arr.length; i++) {
    var result = arr[i]
    if (type === 'IP') {
      var regIp = /^([1-9]|[1-9]d{1}|1dd|2[0-4]d|25[0-5]).([0-9]|[1-9]d{1}|1dd|2[0-4]d|25[0-5]).([0-9]|[1-9]d{1}|1dd|2[0-4]d|25[0-5]).([1-9]|[1-9]d{1}|1dd|2[0-4]d|25[0-5])$/
      if (result.indexOf('-') === -1 && result.indexOf('*') === -1) {
        checkIpRang(result, callback)
        if (!regIp.test(result)) return callback(new Error('请输入正确的ip:' + result))
      } else if (result.indexOf('*') > 0) {
        regIp = /(2(5[0-5]{1}|[0-4]d{1})|[0-1]?d{1,2})(.(2(5[0-5]{1}|[0-4]d{1})|[0-1]?d{1,2})){2}.+*+/
        if (!regIp.test(result)) return callback(new Error('请输入正确的ip:' + result))
      } else {
        checkIpRang(result, callback)
        regIp = /(2(5[0-5]{1}|[0-4]d{1})|[0-1]?d{1,2})(.(2(5[0-5]{1}|[0-4]d{1})|[0-1]?d{1,2})){2}/

        if (!regIp.test(result)) return callback(new Error('请输入正确的ip:' + result))
      }
    } else if (type === 'PORT') {
      var regPort = /^([0-9]|[1-9]d|[1-9]d{2}|[1-9]d{3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])$/
      if (result.indexOf('-') === -1) {
        if (!regPort.test(result)) return callback(new Error('请输入正确的端口:' + result))
      } else {
        const arrPort = result.split('-')
        for (var j = 0; j < arrPort.length; j++) {
          if (!regPort.test(arrPort[j])) return callback(new Error('请输入正确的端口:' + arrPort))
        }
      }
    }
  }
}

function checkIpRang(result, callback) {
  var reges = /-d+.+/
  var value = result.match(reges)
  if (value !== null) return callback(new Error('请输入正确的ip:' + result))
  var index = result.lastIndexOf('.')
  var lastIp = result.substring(index + 1, result.length)
  var arr = lastIp.split('-')
  if (parseInt(arr[0]) > parseInt(arr[1])) return callback(new Error('请输入正确的ip:' + result))
  for (var i = 0; i < arr.length; i++) {
    if (parseInt(arr[i]) > 255) return callback(new Error('请输入正确的ip:' + result))
    if (parseInt(arr[i]) === 0 || arr[i] === '') return callback(new Error('请输入正确的ip:' + result))
  }
}

export function validateCombinedIps(value, callback) {
  if (value === '' || value === undefined || value === null) return callback()
  const arr = value.split(/
/)
  if (arr === null || arr.length === 0) return '输入Ip地址'

  for (var i = 0; i < arr.length; i++) {
    if (arr[i] === '' || arr[i === null]) continue
    var result = arr[i]
    checkIp(result, callback)
    if (callback) break
  }
}

function checkIp(ip, callback) {
  var regIp = /^([1-9]|[1-9]d{1}|1dd|2[0-4]d|25[0-5]).([0-9]|[1-9]d{1}|1dd|2[0-4]d|25[0-5]).([0-9]|[1-9]d{1}|1dd|2[0-4]d|25[0-5]).([1-9]|[1-9]d{1}|1dd|2[0-4]d|25[0-5])$/

  var regIpv6 = /((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))[%.+/]?/

  if (ip.indexOf('::') === -1) { // 正常ip
    if (ip.indexOf('/') === -1 && ip.indexOf('-') === -1) { // 正常单个ip
      if (!regIp.test(ip)) return callback(new Error('IP地址::' + ip + '不是有效的数值!'))
    } else if (ip.indexOf('/') > 0) {
      const arr = ip.split(///)
      for (var i = 0; i < arr.length; i++) {
        var slantIp = arr[i]
        if (slantIp.indexOf('.') === -1) {
          if (Number(slantIp) < 0 || Number(slantIp > 255)) { return callback(new Error('IP地址::' + slantIp + '不是有效的数值!')) }
        }
        if (!regIp.test(slantIp)) return callback(new Error('IP地址:' + slantIp + '不是有效的数值!'))
      }
    } else if (ip.indexOf('-') > 0) {
      const crossArr = ip.split(/-/)
      if (crossArr.length === 2) {
        var num = compareIP(crossArr[0], crossArr[1])
        if (num === 1) {
          for (var j = 0; j < crossArr.length; j++) {
            var crossIp = crossArr[j]
            if (!regIp.test(crossIp)) return callback(new Error('IP地址::' + crossIp + '不是有效的数值!'))
          }
        } else {
          return callback(new Error('IP地址:' + crossArr[1] + '不是有效的数值!'))
        }
      }
    }
  } else {
    if (ip.indexOf('-') > 0) {
      var ipv6Arr = ip.split(/-/)
      if (ipv6Arr.length === 2) {
        var result = compareIpV6(ipv6Arr[1], ipv6Arr[0])
        if (result > 0) {
          for (var m = 0; m < ipv6Arr.length; m++) {
            if (!regIpv6.test(ipv6Arr[m])) return callback(new Error('IP地址::' + ipv6Arr[m] + '不是有效的数值!'))
          }
        } else {
          return callback(new Error('IP地址:' + ipv6Arr[1] + '不是有效的数值!'))
        }
      }
    } else {
      if (!regIpv6.test(ip)) return callback(new Error('IP地址::' + ip + '不是有效的数值!'))
    }
  }
}

function compareIpV6(ip1, ip2) {
  ip1 = convert2CompleteIpV6(ip1)
  ip2 = convert2CompleteIpV6(ip2)
  var ip1s = ip1.split(':')
  var ip2s = ip2.split(':')
  for (var i = 0; i < ip1s.length; i++) {
    if (ip1s[i] === '') {
      if (ip2s[i] === '') {
        continue
      } else {
        return -1
      }
    } else {
      if (ip2s[i] === '') {
        return 1
      } else {
        var value1 = parseInt(ip1s[i], 16)
        var value2 = parseInt(ip2s[i], 16)
        if (value1 > value2) {
          return 1
        } else if (value1 < value2) {
          return -1
        } else {
          continue
        }
      }
    }
  }
}

function convert2CompleteIpV6(ip) {
  var ipV6 = ip
  var index = ip.indexOf('::')
  if (index > 0) {
    var size = 8 - (ip.split(':').length - 1)
    var tmp = ''
    for (var i = 0; i < size; i++) {
      tmp += ':0'
    }
    tmp += ':'
    ipV6 = ip.replace('::', tmp)
  } else if (index === 0) {
    ipV6 = ip.replace('::', '0:0:0:0:0:0:0:')
  }
  return ipV6
}

function compareIP(ipBegin, ipEnd) {
  var temp1
  var temp2
  temp1 = ipBegin.split('.')
  temp2 = ipEnd.split('.')
  for (var i = 0; i <= 3; i++) {
    if (Number(temp2[i]) < Number(temp1[i])) {
      return -1
    }
  }
  return 1
}

export function checkValidateIp(value, callback) {
  if (value === '' || value === undefined || value === null) return callback()
  const reg = /^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$/

  if (!reg.test(value)) return callback(new Error('请输入正确的ip'))
}

export function checkValidateMac(value, callback) {
  if (value === '' || value === undefined || value === null) return callback()
  const reg = /^([A-Fa-fd]{2}:){5}[A-Fa-fd]{2}$/

  if (!reg.test(value)) return callback(new Error('请输入正确的Mac'))
}

export function keyupCheck(event, maxNum) {
  event.target.value = event.target.value.replace(/[^d]/g, '')
  if (event.target.value > maxNum) event.target.value = maxNum
  return event.target.value
}

  vue调用:

 

原文地址:https://www.cnblogs.com/sunliyuan/p/13524787.html