Getting list IPs from CIDR notation in PHP

前端 未结 13 1360
慢半拍i
慢半拍i 2020-12-08 05:38

Is there a way (or function/class) to get the list of IP addresses from a CIDR notation?

For example, I have 73.35.143.32/27 CIDR and want to get the list of all IP\

13条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-08 06:13

    Here is one fast 64bits function to do it, please comment the return line you don't need. Accepting any valid Ipv4 with or without valid CIDR Routing Prefix for example 63.161.156.0/24 or 63.161.156.0

    To run fast the function don't check input but formally it should be a string matching the following regex

    #^(?:((?:0)|(?:2(?:(?:[0-4][0-9])|(?:5[0-5])))|(?:1?[0-9]{1,2}))\.((?:0)|(?:2(?:(?:[0-4][0-9])|(?:5[0-5])))|(?:1?[0-9]{1,2}))\.((?:0)|(?:2(?:(?:[0-4][0-9])|(?:5[0-5])))|(?:1?[0-9]{1,2}))\.((?:0)|(?:2(?:(?:[0-4][0-9])|(?:5[0-5])))|(?:1?[0-9]{1,2}))(?:/((?:(?:0)|(?:3[0-2])|(?:[1-2]?[0-9]))))?)$#
    

    If you want to verify the input before using the function

    To get the full range as an array for a given IP (with or without CIDR Routing Prefix) you can use the following code but be carefull because for example 25.25.25.25/16 return an array with 65536 elements and you can easily run out of memory using a smaller Routing Prefix

    To fast check if a given ipv4 is matching a given CIDR you can do it inline like in this example

    =$range[0] && $check<=$range[1])
    {
    echo 'Yes, '.$given_ipv4.' is included in '.$given_cidr;
    }
    else
    {
    echo 'No, '.$given_ipv4.' is not included in '.$given_cidr;
    }
    

    To fast check if a given ipv4 is matching a given array of IP (with or without CIDR Routing Prefix)

    ';
    $in_range=false;
    if (($given_ipv4_dec=ip2long($given_ipv4))!==false)
    {
    foreach($given_cidr_array as $given_cidr){
    if(($range=cidr2range($given_cidr)) &&
    $given_ipv4_dec>=$range[0] && $given_ipv4_dec<=$range[1])
    {
    $in_range=true;
    echo $given_ipv4.' matched '.$given_cidr.' ('.join(array_map('long2ip',$range),' - ').")\n";
    }
    }
    }
    echo $given_ipv4.' is probably'.($in_range?'':' not').' a Googlebot IP';
    

    hope that these few lines have helped you…

提交回复
热议问题