Javascript 如何重写此函数以避免';您不必显式地键入范围内的每个IP地址吗?

Javascript 如何重写此函数以避免';您不必显式地键入范围内的每个IP地址吗?,javascript,jquery,regex,Javascript,Jquery,Regex,我想运行一个特定的脚本的基础上,一组IP的已经给了我 我下面的脚本工作得很好,但是它看起来很草率,而且对于我想要完成的任务,它喜欢太多的代码 我简化了IP地址的数量,这样就不会把屏幕弄得乱七八糟 <script> //Initialize the array //HostMin: 196.145.179.129 HostMax: 196.145.179.130 var $ipArray = ["196.145.179.129","

我想运行一个特定的脚本的基础上,一组IP的已经给了我

我下面的脚本工作得很好,但是它看起来很草率,而且对于我想要完成的任务,它喜欢太多的代码

我简化了IP地址的数量,这样就不会把屏幕弄得乱七八糟

<script>
    //Initialize the array
    //HostMin: 196.145.179.129  HostMax:   196.145.179.130            
    var $ipArray = ["196.145.179.129","196.145.179.130"];
    //HostMin: 50.207.77.201  HostMax:   50.207.77.204            
    $ipArray.push("50.207.77.201","50.207.77.202","50.207.77.203","50.207.77.204");
    //HostMin: 57.179.277.209  HostMax:   57.179.277.214       
    $ipArray.push("57.179.277.209","57.179.277.210","57.179.277.211","57.179.277.212","57.179.277.213","57.175.277.214");
    //HostMin: 74.97.164.65  HostMax:   74.97.164.66       
    $ipArray.push("74.97.164.65","74.97.164.66");

    $ipAddr = "74.97.164.65";

    if ($.inArray($ipAddr, $ipArray ) >= 0) {
        //Do Something
    }else{
        //Do Something else
    }
</script>    

//初始化数组
//HostMin:196.145.179.129 HostMax:196.145.179.130
var$ipArray=[“196.145.179.129”,“196.145.179.130”];
//主机最小值:50.207.77.201主机最大值:50.207.77.204
$ipArray.push(“50.207.77.201”、“50.207.77.202”、“50.207.77.203”、“50.207.77.204”);
//HostMin:57.179.277.209 HostMax:57.179.277.214
$ipArray.push(“57.179.277.209”、“57.179.277.210”、“57.179.277.211”、“57.179.277.212”、“57.179.277.213”、“57.175.277.214”);
//主机最小值:74.97.164.65主机最大值:74.97.164.66
$ipArray.push(“74.97.164.65”、“74.97.164.66”);
$ipAddr=“74.97.164.65”;
如果($.inArray($ipAddr,$ipArray)>=0){
//做点什么
}否则{
//做点别的
}
我确实有IP筛选器之类的信息-
50.207.77.201/30
,如果这会产生影响的话


如果您能帮我重写,我们将不胜感激。

我不是一个聪明人,我发布了一条PHP回复。由于其他人在这个线程中提到了我的答案,我不会删除它。理论上,您可以使用Javascript和我的答案的基本逻辑:

function ip2long (IP) {
  // http://kevin.vanzonneveld.net
  // +   original by: Waldo Malqui Silva
  // +   improved by: Victor
  // +    revised by: fearphage (http://http/my.opera.com/fearphage/)
  // +    revised by: Theriault
  // *     example 1: ip2long('192.0.34.166');
  // *     returns 1: 3221234342
  // *     example 2: ip2long('0.0xABCDEF');
  // *     returns 2: 11259375
  // *     example 3: ip2long('255.255.255.256');
  // *     returns 3: false
  var i = 0;
  // PHP allows decimal, octal, and hexadecimal IP components.
  // PHP allows between 1 (e.g. 127) to 4 (e.g 127.0.0.1) components.
  IP = IP.match(/^([1-9]\d*|0[0-7]*|0x[\da-f]+)(?:\.([1-9]\d*|0[0-7]*|0x[\da-f]+))?(?:\.([1-9]\d*|0[0-7]*|0x[\da-f]+))?(?:\.([1-9]\d*|0[0-7]*|0x[\da-f]+))?$/i); // Verify IP format.
  if (!IP) {
    return false; // Invalid format.
  }
  // Reuse IP variable for component counter.
  IP[0] = 0;
  for (i = 1; i < 5; i += 1) {
    IP[0] += !! ((IP[i] || '').length);
    IP[i] = parseInt(IP[i]) || 0;
  }
  // Continue to use IP for overflow values.
  // PHP does not allow any component to overflow.
  IP.push(256, 256, 256, 256);
  // Recalculate overflow of last component supplied to make up for missing components.
  IP[4 + IP[0]] *= Math.pow(256, 4 - IP[0]);
  if (IP[1] >= IP[5] || IP[2] >= IP[6] || IP[3] >= IP[7] || IP[4] >= IP[8]) {
    return false;
  }
  return IP[1] * (IP[0] === 1 || 16777216) + IP[2] * (IP[0] <= 2 || 65536) + IP[3] * (IP[0] <= 3 || 256) + IP[4] * 1;
}
我找到了一个可能非常适合你的

在他们的文章中,他们谈到了在网络上进行迭代(通过使用子网掩码,而不是通过实际与网络交互),我认为这将完全满足您的需求

   var ip = new IPv4("192.168.0.100");
   var subnet = new Subnet("/24");

   var ipnet = new IPv4Network(ip,subnet);

   var network = ipnet.network();     //IPv4("192.168.0.0")
   var broadcast = ipnet.broadcast(); //IPv4("192.168.255.255");

   var stopIP = new IPv4("192.168.0.10");
   range_ips = [];                
   ipnet.iter(function(ip,index) {
       range_ips.push(ip);
       if(ip.equals(stopIP)) return false;
   });

   //check IPs are in a network
   var is_contained = ipnet.contains(ip)           //true;
   var total = ipnet.count();                      //254

这个答案并没有完全回答OP问题,而是补充了Rob M现有的答案。它提供了一个更简单、更快的功能,可以完成大部分工作

用于将IP地址转换为32位无符号整数的JavaScript函数
//将IPv4虚线四元地址转换为无符号32位整数
//如果IP地址格式不正确,则返回FALSE
功能ip2int(ip){
var val=false,//假定传递的IP无效。
//用于验证和解析IP(版本4)地址的正则表达式。
(25[0-5]| 2[0-4][0-9]|[01]|[0-9][0-9]?)\(25[0-5]| 2[0-4][0-9]|[01]|[0-9][0-9][0-9]|[01]|[0-4][0-9]。\(25[0-5]|[0-5]|[0-4][0-9][0-9]1240-9]。\(25[0-5]1240-5]1240-4][0-4][0-9]1240-9]/);
//使用String.replace()和回调函数一次性进行验证和分析。
ip.replace(重新生效),
功能(m0、m1、m2、m3、m4){
val=((m10;
返回“”;
});
返回val;
}

这绝对是一个值得解决的问题,因为我不认为
x.x.277.x
是一个有效的IP。我更改了一些数字,以省略我正在使用的实际IP。您使用
$
令人困惑。按照惯例,javascript开发人员只在变量引用jQuery对象时才倾向于在变量前面加上
$
。您的代码看起来一点也不邋遢-我可以通过查看它来判断它是做什么的-它非常简单-没有函数调用,它在那里也很好。当然-它很简单,但这是一件好事。如果这是您唯一的用例,我肯定会保持相同的方式。请记住,客户端脚本可以很容易地修改。而且,它可能不是一般来说,在客户端列出IP地址是个好主意。呃,这是php,问题是关于javascript的。这个问题被标记为javascript。虽然我必须承认他在变量名中使用了
$
,但我看了两遍。@bfaretto-Doh!很抱歉,我会修改我的答案。我在JS中也使用了
$
,但没有看清楚答案问号。这是比OP更长的代码——而且也不太清楚。更不用说库的开销了。
   var ip = new IPv4("192.168.0.100");
   var subnet = new Subnet("/24");

   var ipnet = new IPv4Network(ip,subnet);

   var network = ipnet.network();     //IPv4("192.168.0.0")
   var broadcast = ipnet.broadcast(); //IPv4("192.168.255.255");

   var stopIP = new IPv4("192.168.0.10");
   range_ips = [];                
   ipnet.iter(function(ip,index) {
       range_ips.push(ip);
       if(ip.equals(stopIP)) return false;
   });

   //check IPs are in a network
   var is_contained = ipnet.contains(ip)           //true;
   var total = ipnet.count();                      //254