2016-04-13 24 views
0
0000:0000:0000:0000:0000:0000:0000:0000 
0000:0000:0000:0000:FFFF:0000:0002:AC11 

i etkin bir şekilde yukarıdaki ipv6 adresinden 0000 parça şerit olabilir dönüştürmek için:javascript'te ipv6 adresini nasıl şeritleyebilirim?

0000 
FFFF:0000:0002:AC11 
+1

olamazlar [ ' "% ip%" .Kapağı (/^(0000:) + /)'] (https://regex101.com/r/jU7qM5/1)? Yoksa bir şey mi özlüyorum? – Yoshi

+0

@Yoshi, lütfen bunu yanıt olarak kabul edip çözümünüzü kabul edebilirim .. –

+0

https://tools.ietf.org/html/rfc4291#section-2.2 ve https://tools.ietf.org adresindeki IPv6 gösterimini kontrol edin /html/rfc5952#section-4.2 Dikkatli olun, sadece dize başlangıcında "0000:" sıfıra basmak geçerli bir adres veremiyor (çift başlatma eksikliği: ") –

cevap

2
kullanabilirsiniz

: desen üzerine sabitlenir

"0000:0000:0000:0000:FFFF:0000:0002:AC11".replace(/^(0000:)+/) 

dize başlangıcı ve oradan 0000: tekrarlayan oluşumları kaldırır.


Demo: Bir değil geçerli IPv6 gösterimi verebilmesidir: https://regex101.com/r/jU7qM5/1

+0

http://tools.ietf.org/html/rfc4291#section-2.2 ve http://tools.ietf.org/html/rfc5952#section-4.2 bu yöntemin (hatta kesin soruya doğru cevap olması anlamına gelir)) geçerli IPv6 adresi temsilleri veremez. –

2
//ip is a string 
function stripIP(ip){ 
    var result = ""; 
    var arr = ip.match(/(?:0000:)*(.*)/); 
    if(arr[1]){ 
    result = arr[1]; 
    } 
return result; 
} 
+0

Bu iyi bir cevap! –

0

http://tools.ietf.org/html/rfc4291#section-2.2 olarak ve http://tools.ietf.org/html/rfc5952#section-4.2 sadece bu "0000" dışarı sıyırma açıklar.

Sadece bir grup siper için "::" ikamesi yapılmamalıdır, sadece adreste bir kez yapılabilir ve her bir basamak grubunun içinde 0'lık sıyırma sıyırma işlemi gerçekleştirilmelidir. Ayrıca IPv4 haritalaması da dikkate alınmalıdır.

Kullanayım:

function ip_notation(ip){ 
    var ip=ip.toLowerCase(); 
    //Watch out IPv6/IPv4 addresses notation 
    //::ffff:XXX.XXX.XXX.XXX vs ::ffff:xxxx:xxxx 
    if(ip.substr(0,24)=='00000000000000000000ffff'){ 
    ip4= (ip.substr(24)); 
    ip4=ip4.match(/.{1,2}/g); 
    for(k=0;k<4;k++){ip4[k]=parseInt(ip4[k],16);} 
    ip='::ffff:'+ ip4.join('.'); 
    return ip; 
    } 
    field=ip.match(/.{1,4}/g);//Cut string in 4 digits fields 
    //Find the longest ceroes fields group (maybe could be done with a regex) 
    var max_ceroes_fields=0; 
    var ceroes_fields=0; 
    for(k=0;k<8;k++){ 
    if(field[k] == '0000') { //All '0' field 
     ceroes_fields++; 
     if(ceroes_fields > max_ceroes_fields) { 
     max_ceroes_fields = ceroes_fields; 
     } 
    }else{//Not all '0' field 
     ceroes_fields = 0; 
    } 
    } 
    ip=field.join(":");//makes a string again, now with 4 digit groups 
    //replace the longest ceroes group with "::" 
    if(max_ceroes_fields>1) { 
    var ceroes=(":0000".repeat(max_ceroes_fields)).substr(1); 
    ip=ip.replace(ceroes,':'); 
    //Works fine if it is at the start or end, but produces ":::" in the middle 
    ip=ip.replace(':::','::'); 
    } 
    //Strip leading ceroes of fields 
    ip.replace(/^(0){1,3}/,''); 
    return ip; 
} 
0

(ip IPv6 adresinin 16 karakter HEX dize temsilidir) ip6 npm paketini deneyin:

ip6https://www.npmjs.com/package/ip6, bölme alt ağlar normalleştirmek kısaltmak için yardımcı olur, üretmek rastgele alt ağlar/ana bilgisayarlar ve bir IPv6 alt ağının boyut aralığını hesaplar.

let ip6 = require('ip6'); 
console.log(ip6.abbreviate('2001:0001:0000:0001:0000:0000:0000:0001')); 
// 2001:1:0:1::1 
İlgili konular