簡體   English   中英

如何使用 javascript 壓縮 IPV6 地址?

[英]How to compress IPV6 address using javascript?

我在java看到了壓縮IPV6的代碼。 鏈接指定相同。 下面是Java中的代碼。 String resultString = subjectString.replaceAll("((?::0\\b){2,}):?(?:\\S*\\b\\1,0\\b)(\\S*)": ":;$2"); 但是在 Javascript 中,我很困惑如何才能讓正則表達式匹配相同的內容。 你能在這里分享一些建議嗎?

示例:fe80:00:00:00:8e3:a11a:2a49:1148 結果:fe80::8e3:a11a:2a49:1148

@ClasG 的另一個答案有幾個問題:

  1. 如果重復的零位於 IPv6 地址的開頭或全部為零,則僅替換 1 個冒號。
  2. 如果重復的零在末尾,則不會替換它們。

我建議使用正則表達式\\b:?(?:0+:?){2,}並將其替換為:: :(兩個冒號)

Regex101 測試

JavaScript 示例:

 var ips = [ '2001:0db8:ac10:0000:0000:0000:0000:ffff', '2001:0db8:ac10:0000:0000:0000:0000:0000', '0:0:0:0:0:2001:0db8:ac10', '2001:0db8:ac10:aaaa:0000:bbbb:cccc:ffff', '2001:0db8:ac10:0000:0000:bbbb:00:00' ]; for (var i = 0; i < ips.length; i++) { document.write(ips[i].replace(/\\b:?(?:0+:?){2,}/, '::') + "<br>"); }

注意:Regex101 測試替換了多個重復的零組。 在XYZ的編程語言,你就必須更換的次數限制為1。在JavaScript中,省略了葉形標志。 在 PHP 中,您將preg_replace$limit設置為 1。

你可以通過替換來做到

\b(?:0+:){2,}

:

 function compIPV6(input) { return input.replace(/\\b(?:0+:){2,}/, ':'); } document.write(compIPV6('2001:db8:0:0:0:0:2:1') + '<br/>'); document.write(compIPV6('fe80:00:00:00:8e3:a11a:2a49:1148' + '<br/>'));

在 regex101 上查看

您可以使用此方法來壓縮 IPv6 並刪除前導 0:

 function compressIPV6(input) { var formatted = input.replace(/\\b(?:0+:){2,}/, ':'); var finalAddress = formatted.split(':') .map(function(octet) { return octet.replace(/\\b0+/g, ''); }).join(':'); return finalAddress; } document.write(compressIPV6('2001:0db8:0000:0000:0000:0000:1428:57ab') );

您可以使用 function 來考慮所有需要的情況:

 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/>');

如果多次出現相同長度的連續“0”八位字節,它只會替換第一個。 無論重復零是在開頭、中間還是結尾,這都將起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM