const compressIPV6 = (ip) => {
//First remove the leading 0s of the octets. If it's '0000', replace with '0'
let output = ip.split(':').map(terms => terms.replace(/\b0+/g, '') || '0').join(":");
//Then search for all occurrences of continuous '0' octets
let zeros = [...output.matchAll(/\b:?(?:0+:?){2,}/g)];
//If there are occurences, see which is the longest one and replace it with '::'
if (zeros.length > 0) {
let max = '';
zeros.forEach(item => {
if (item[0].replaceAll(':', '').length > max.replaceAll(':', '').length) {
max = item[0];
}
})
output = output.replace(max, '::');
}
return output;
}
document.write(compressIPV6('38c1:3db8:0000:0000:0000:0000:0043:000a') + '<br/>');
document.write(compressIPV6('0000:0000:0000:0000:38c1:3db8:0043:000a') + '<br/>');
document.write(compressIPV6('38c1:3db8:0000:0043:000a:0000:0000:0000') + '<br/>');
document.write(compressIPV6('38c1:0000:0000:3db8:0000:0000:0000:12ab') + '<br/>');
4条答案
按热度按时间yzckvree1#
@ClasG的另一个答案有几个问题:
1.如果重复的零位于IPv6地址的开头或全部为零,则仅替换1个冒号。
1.如果重复的零位于末尾,则不会替换它们。
我建议使用正则表达式
\b:?(?:0+:?){2,}
并将其替换为::
(两个冒号)Regex101 tests
JavaScript示例:
注意:Regex101测试会取代多个重复的零群组。在XYZ程序设计语言中,您必须将取代的数目限制为1。在JavaScript中,您可以省略gglobal旗标。在PHP中,您可以将
preg_replace
的$limit
设定为1。vvppvyoh2#
您可以通过替换
与
Check it out at regex101。
fzsnzjdm3#
您可以使用此方法来压缩IPv6并删除前导0:
vmdwslir4#
您可以使用考虑所有需要情况的函数:
如果出现多个相同长度的连续“0”八位字节,则只替换第一个。无论重复的零是在开头、中间还是结尾,此操作都有效。