2012-05-02 8 views
1

実際にこの機能がありますが、非常に醜いです。夜は目を覚まして、それを達成するための雄弁なコードを思いついています。IPアドレスをオクテットに分割し、各オクテットで数式を計算します

IP範囲を表す一連の文字列を取り、文字列が表す実際のIPアドレスの数を判断する必要があります。私のアプローチは、それを4つのオクテットに分割し、各オクテットを分割してそこから数えてみることでした。

例:1.2.3.4-6は1.2.3.4,1.2.3.5,1.2.3.6を表します。したがって、この範囲から3の回答を得たいと思います。

私が始めている文字列は、改行で区切られたテキストボックスからそのような範囲のリストになる可能性があるので、各行を個別に調べ、表現されたIPアドレスの数を取得し、最後に、提出された範囲のうちどれくらいがこの条件を持っているかを示します。

1.1.1.4-6  /* Represents 3 actual IP Addresses, need to know "3" */ 
2.2.3-10.255 /* Represents 8 actual IP Addresses, need to know "8" */ 
3.3.3.3  /* No ranges specified, skip this 
4.4.4.4  /* No ranges specified, skip this 

ネット結果は、私が知りたいことである2行はいずれも雄弁なソリューションが私の睡眠スケジュールによって理解される8つのIPアドレス(3 + 8)

を表す「範囲」を、含まれていることです。 : )

+0

あなたが範囲と各ラインの範囲の合計またはすべての行の1つだけ全体の合計を含む行の行番号を知りたいですか? –

答えて

2

There you go:

var ips = ["1.2.3.4", "2.3.4-6.7", "1.2.3.4-12"]; 
for(var i=0; i<ips.length; i++) { 
    var num = 1; 
    var ip = ips[i]; 
    var parts = ip.split('.'); 
    for(var j=0; j<parts.length; j++) { 
     var part = parts[j]; 
     if(/-/.test(part)) { 
      var range = part.split('-'); 
      num *= parseInt(range[1]) - parseInt(range[0]) + 1; 
     } 
    } 
    alert(ip + " has " + num + " ips."); 
}​ 

このコードは、正しく1.2.3-4.0-255(その範囲内の、即ち256 * 2 = 512 IPS)のような範囲を扱います。範囲を持たないリスト項目は合計1 ipsとなり、必要がなければnumという結果に基づいて無視することができます。

おそらく私の例を少し修正する必要がありますが、私はそうすることに何の問題もないと確信しています。

+0

完璧に見えます、ありがとう、最も親切に! – GDP

2

[OK]を、これは私がそれを行うだろうかある

var addr = '1.1.3-10.4-6'; 

function getNumAddresses(input) { 
    var chunks = input.split('.'); 
    var result = 1; 

    for (var i = 0; i < 4; i++) { 
     if (chunks[i].indexOf('-') != -1) { 
      var range = chunks[i].split('-'); 
      result *= parseInt(range[1]) - parseInt(range[0]) + 1; 
     } 
    } 

    return result; 
} 

alert(getNumAddresses(addr)); 
+0

+1は素晴らしい答えですが、チェックするIP範囲のリストに何回出現したかを返しません – GDP

関連する問題