Php 如何将IP转换为CIDR块?(菲律宾)

Php 如何将IP转换为CIDR块?(菲律宾),php,ip,cidr,Php,Ip,Cidr,我有ip,我想将其转换为具有特定掩码的CIDR块(/28,例如)。使用PHP 因此,输入“1.1.1.100”和“28”,输出为“1.1.1.96/28” 我找到了很多匹配的函数和范围,但并没有关于从ip到CIDR的转换。这似乎是最基本的操作,可能是我遗漏了什么,使用了错误的搜索词或误解 对于上下文:我需要阻止机器人,我有他们的IP,并希望阻止ipset中的范围/24有点太多(但很容易制作,只需将最后一位替换为“.0/24”),所以我想使用/27/28/29。这就是您想要的吗?我搜索了一下,发现

我有ip,我想将其转换为具有特定掩码的CIDR块(/28,例如)。使用PHP

因此,输入“1.1.1.100”和“28”,输出为“1.1.1.96/28”

我找到了很多匹配的函数和范围,但并没有关于从ip到CIDR的转换。这似乎是最基本的操作,可能是我遗漏了什么,使用了错误的搜索词或误解


对于上下文:我需要阻止机器人,我有他们的IP,并希望阻止ipset中的范围/24有点太多(但很容易制作,只需将最后一位替换为“.0/24”),所以我想使用/27/28/29。

这就是您想要的吗?我搜索了一下,发现这个和你的输出很接近。你可以找到更多信息

是。。。美丽的

function ip_to_mask28($ip)
{
    $ip_parts = explode('.', $ip);
    $mask28 = [0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256];
    foreach ( $mask28 as $key => $value )
        if ( $ip_parts[3] < $mask28[$key + 1] )
            return $ip_parts[0].'.'.$ip_parts[1].'.'.$ip_parts[2].'.'.$value.'/28';
}
echo ip_to_mask28('1.1.1.100'); // 1.1.1.96/28 
功能ip到mask28($ip)
{
$ip_parts=爆炸('.',$ip);
$mask28=[0,16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256];
foreach($mask28作为$key=>$value)
如果($ip_零件[3]<$mask28[$key+1])
返回$ip_零件[0]。$ip_零件[1]。$ip_零件[2]。$value./28';
}
回声ip_至_mask28('1.1.1.100');//1.1.1.96/28 
现在用这个滚动

否:输入IP(和掩码),输出CIDR块。
function ipRange($cidr) {
   $range = array();
   $cidr = explode('/', $cidr);
   $range[0] = long2ip((ip2long($cidr[0])) & ((-1 << (32 - (int)$cidr[1]))));
   $range[1] = long2ip((ip2long($range[0])) + pow(2, (32 - (int)$cidr[1])) - 1);
   return $range;
}

var_dump(ipRange('1.1.1.100/28'));
array(2) {
 [0]=>
 string(8) "1.1.1.96"
 [1]=>
 string(9) "1.1.1.111"
}
function ip_to_mask28($ip)
{
    $ip_parts = explode('.', $ip);
    $mask28 = [0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256];
    foreach ( $mask28 as $key => $value )
        if ( $ip_parts[3] < $mask28[$key + 1] )
            return $ip_parts[0].'.'.$ip_parts[1].'.'.$ip_parts[2].'.'.$value.'/28';
}
echo ip_to_mask28('1.1.1.100'); // 1.1.1.96/28