保證測試通過的ip正則,antdIP/IP段的校驗方法,antd的textArea中可以輸入多個以換行分隔的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])))))$/;
簡單說明一下:網上的ip正則大部分都沒有判斷1.0.0.1或者1.01.01.02這種,可能他們默認這種一點分隔開的每一項都可以以0開頭,而我們的測試不允許這樣,所以我就稍加判斷,像這種192.168.01.1這種的就無法通過,必須寫成192.168.1.1這樣的
 
 
再附上antd的自定義校驗ip/ip段的方法 注:intl.get()此方法是antd項目中國際化的插件,閱讀時可以忽略。
 192.168.1.1
 192.168.1.2/24
 192.168.1.1-192.168.1.50
這些都是可以通過的
export function checkIp(rule, value, callback) {
if (!value) {
callback();
return;
}
// 如果有 - ,分開校驗
if (value.indexOf('-') > -1) {
const ips = value.split('-');

for (let i = 0; i < ips.length; i++) {
if (!ipRegex.test(ips[i])) {
callback(
intl.get('請輸入正確的IP/IP段。例,192.168.1.1-192.168.1.50')
);
return true;
}
}

// 校驗前后2個ip的大小關系
const ip1Number = ip2number(ips[0]);
const ip2Number = ip2number(ips[1]);

if (ip1Number >= ip2Number) {
callback(
intl.get('網段截止IP必須大於網段起始IP')
);
}

} else if (value.indexOf('/') > -1) {
const ips = value.split('/');
// 校驗第一個 ip
if (!ipRegex.test(ips[0])) {
callback(intl.get('請輸入正確的IP/IP段。例,192.168.1.2/24'));
}
// 校驗子網掩碼
if (!ips[1] || isNaN(ips[1])) {
callback(intl.get('子網掩碼范圍是(0,32]。例,192.168.1.2/24'));
}
// 這里把 0 排除掉
if (ips[1] <= 0 || ips[1] > 32) {
callback(intl.get('子網掩碼范圍是(0,32]。例,192.168.1.2/24'));
}
} else if (!ipRegex.test(value)) {
callback(intl.get('請輸入正確的IP/IP段'));
}

callback();
};
 
再附上antd的textArea中可以輸入多個以換行分隔的ip/IP段,並自動檢測出錯行的原因的方法
 
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 = intl.get("第n行[ip]", { num: index + 1, ip: ip });
if (!ip) {
throw lineText + intl.get('掃描資產不能為空');
}
// 校驗去重
if (passArr.indexOf(ip) !== -1) {
throw lineText + intl.get('已重復');
}
// 如果有 - ,分開校驗
if (ip.indexOf('-') > -1) {
const ips = ip.split('-');

for (let i = 0; i < ips.length; i++) {
if (!ipRegex.test(ips[i])) {
throw lineText + intl.get('請輸入正確的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 + intl.get('網段截止IP必須大於網段起始IP');
}

} else if (ip.indexOf('/') > -1) {
const ips = ip.split('/');
// 校驗第一個 ip
if (!ipRegex.test(ips[0])) {
throw lineText + intl.get('請輸入正確的IP/IP段。例,192.168.1.2/24');
}
// 校驗子網掩碼
if (!ips[1] || isNaN(ips[1])) {
callback(intl.get('子網掩碼范圍是(0,32]。例,192.168.1.2/24'));
}
// 這里把 0 排除掉
if (ips[1] <= 0 || ips[1] > 32) {
throw lineText + intl.get('子網掩碼范圍是(0,32]。例,192.168.1.2/24');
}
} else if (!ipRegex.test(ip)) {
throw lineText + intl.get('請輸入正確的IP/IP段');
}

passArr.push(ip);
})
} catch (e) {
callback(e);
} finally {
callback()
}
} else {
callback();
}
};
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM