Свернутый текст
function checkIP($ip, $addr)
{
list($ipNet, $mask) = explode('/', $addr);
$ip = sprintf('%u', ip2long($ip));
$ipNet = str_pad(decbin(ip2long($ipNet)), 32, 0, STR_PAD_LEFT);
$fullNet = decbin(ip2long('255.255.255.255'));
$net = str_pad(str_pad('', $mask, 1), 32, 0);
$maxIp = str_replace('-', 1, str_replace(1, 0, str_replace(0, '-', ($fullNet & $net))));
$maxIp = bindec($ipNet | $maxIp) - 1;
$minIp = bindec($ipNet & $net) + 1;
return ($ip >= $minIp && $ip <= $maxIp) ? true : false;
}
$ip = '127.0.0.1';
$netAddr = '127.0.0.5/12';
var_dump(checkIP($ip, $netAddr));
На выходе выдает bool(true)
Кстати, Invis1ble, твое решение выдает false. И также false выдает при разных значениях маски (/20 или /11), хотя должно быть true.
PS: калькулятор в помощь :)
Не пойму почему после применения инверсии выдает знаки вопроса? :huh:
Если написать ~($fullNet & $net) выдаст вопросы... Может это из-за юникода ?
Чтобы обойти это, пришлось
Свернутый текст
str_replace('-', 1, str_replace(1, 0, str_replace(0, '-', ($fullNet & $net))));
Спустя 8 часов, 43 минуты, 24 секунды Winston написал(а):
imbalance_hero