1.输入多个IP用逗号隔开验证函数
//多个ip以','隔开,输入验证函数,例:172.21.33.7,172.21.33.9-254
export default function validIp(value) {
const ipv4s = value.split(',')
for (let item of ipv4s) {
if (item.includes('-')) {
let arr = item.split('-')
if (arr.length > 2) {
return false
}
let [front, after] = arr
let end = front.split('.')[3]
if (!/(^[1-9]\d*$)/.test(after) || end - after >= 0 || after > 255) {
return false
}
} else {
let valid = checkIpv4(item)
if (!valid) return false
}
}
return true
}
//格式化ip
/*
* FilePath: \src\views\strategy\formatter-ip.js
* Project: xxx
* CreatedAt: 2021-03-01 17:39:41
* CreatedBy: 666
* Copyright: (c) 2021
* Task: #1
* 格式化ip函数
*/
import { split as _split, isEmpty } from 'lodash'
/**
* ip数组格式化--输入&返回均为数组
* 例:172.21.33.7,172.21.33.9-254
* 输入:[172.21.33.7,172.21.33.9-254] //数组中元素为字符串,在这里省略了""
* 返回:[172.21.33.7,172.21.33.9-172.21.33.254]
* @param {array} ipv4List
*/
//封装数据写入数据库调用
export function ipFormatterArray (ipv4List) {
ipv4List.forEach((item, index) => {
if (item.includes('-')) { // 172.21.33.9-254
const before = item.split('-')[0] // 172.21.33.9
let after = item.split('-')[1] // 254
const split = _split(before, '.', 3) // [172,21,33]
const splitStr = split.join('.') // 172.21.33
after = splitStr + '.' + after // 172.21.33.254
ipv4List[index] = before + '-' + after // "172.21.33.9-172.21.33.254"
}
})
return ipv4List []
}
/**
* ip数组格式化成字符串输出--输入数组、返回字符串
* 例:"172.21.33.7,172.21.33.9-172.21.33.254"
* 输入:[172.21.33.7,172.21.33.9-172.21.33.254] //数组中元素为字符串,在这里省略了""
* 返回:"172.21.33.7,172.21.33.9-254"
* @param {array} ipv4List
*/
//将数据库返回的数据写显示在页面上时调用
export function ipFormatterString (ipv4List) {
if(!isEmpty(ipv4List)) {
ipv4List.forEach((item, index) => {
if (item.includes('-')) { // 172.21.33.9-172.21.33.254
const before = item.split('-')[0] // 172.21.33.9
const after = item.split('-')[1] // 172.21.33.254
const end = after.split('.')[3] || after // 254
ipv4List[index] = before + '-' + end // 172.21.33.9-254
}
})
const ipv4Str = ipv4List.join(',') // "172.21.33.7,172.21.33.9-254"
return ipv4Str
}
return ''
}
//(1)封装数据写入数据库 "172.21.33.7,172.21.33.9-254" => "172.21.33.7,172.21.33.9-172.21.33.254"
let sourceIpList = this.sourceIp.split(',') //this.sourceIp=172.21.33.7,172.21.33.9-254
sourceIpList = ipFormatterArray(sourceIpList)
let data = {
sourceIp: sourceIpList.join(','), //sourceIp="172.21.33.7,172.21.33.9-172.21.33.254"
destIp: destIpList.join(','),
riskLevel: Number(riskLevel),
remark
}
//(2)将数据库返回的数据显示在页面上 "172.21.33.7,172.21.33.9-172.21.33.254" => "172.21.33.7,172.21.33.9-254"
const { sourceIp, destIp, riskLevel } = this.currentModel
let sourceIpList = sourceIp.split(',')
this.sourceIp = ipFormatterString(sourceIpList)
2.正则表达式验证IP和端口格式的正确性
(1)ip的正则表达式:
正则表达式 - 元字符(^ 、$ 、* 、\ 、+ 、? …)
格式是由“.”分割的四部分,每部分的范围是0-255;
每段的正则可以分几部分来写:200—255;100-199;10-99;0-9;
每一部分对应的正则表达式: 2[0-4]\d|25[0-5]; 1\d{2}; [1-9]\d; \d
所以连起来就是:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]**
那么IP的正则就是(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])
在JS中表示为:/^(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])$/
-----------------------------------------------------------------------------------------
注:IP地址格式可表示为:XXX.XXX.XXX.XXX,XXX取值范围是0-255,前三段加一个.重复了三次,在与最后一段合并及组成IP地址的完整格式。
所以IP地址的正则表示法如下:
=========================================================================================
ipv4: /^((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))$/
其中: ? 表示:匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 。? 等价于 {0,1}。
========================================================================================
ipv6: /^([\da-fA-F]{1,4}:){7}[\da-fA-F]{1,4}$/
(2)端口的正则表达式:
格式是0-65535,。
同理可以分为几部分来构造:60000-65535;10000-59999;1000-9999;100-999;10-99;0-9;
每部分的正则是: 6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5]; [1-5]\d{4}; [1-9]\d{3}; [1-9]\d{2};[1-9]\d; [0-9]
整理完就是:([0-9]|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])
JS中表示为:
port: /^([0-9]|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/