php 判断ip 段,PHP 判断 IP 段方法

/**

* $range 支持多种写法

* - Wildcard: 1.2.3.*

* - CIRD:1.2.3/24 或者 1.2.3.4/255.255.255.0

* - Start-End: 1.2.3.0-1.2.3.255

* @param $ip

* @param $range

* @return bool

*/

public function ipInRange($ip, $range)

{

if (strpos($range, '/') !== false) {

// $range is in IP/NETMASK format

list($range, $netmask) = explode('/', $range, 2);

if (strpos($netmask, '.') !== false) {

// $netmask is a 255.255.0.0 format

$netmask = str_replace('*', '0', $netmask);

$netmask_dec = ip2long($netmask);

return ((ip2long($ip) & $netmask_dec) == (ip2long($range) & $netmask_dec));

} else {

// $netmask is a CIDR size block

// fix the range argument

$x = explode('.', $range);

while (count($x) < 4) {

$x[] = '0';

}

list($a, $b, $c, $d) = $x;

$range = sprintf("%u.%u.%u.%u", empty($a) ? '0' : $a, empty($b) ? '0' : $b, empty($c) ? '0' : $c,

empty($d) ? '0' : $d);

$range_dec = ip2long($range);

$ip_dec = ip2long($ip);

# Strategy 1 - Create the netmask with 'netmask' 1s and then fill it to 32 with 0s

#$netmask_dec = bindec(str_pad('', $netmask, '1') . str_pad('', 32-$netmask, '0'));

# Strategy 2 - Use math to create it

$wildcard_dec = pow(2, (32 - $netmask)) - 1;

$netmask_dec = ~$wildcard_dec;

return (($ip_dec & $netmask_dec) == ($range_dec & $netmask_dec));

}

} else {

// range might be 255.255.*.* or 1.2.3.0-1.2.3.255

if (strpos($range, '*') !== false) { // a.b.*.* format

// Just convert to A-B format by setting * to 0 for A and 255 for B

$lower = str_replace('*', '0', $range);

$upper = str_replace('*', '255', $range);

$range = "$lower-$upper";

}

if (strpos($range, '-') !== false) { // A-B format

list($lower, $upper) = explode('-', $range, 2);

$lower_dec = (float)sprintf("%u", ip2long($lower));

$upper_dec = (float)sprintf("%u", ip2long($upper));

$ip_dec = (float)sprintf("%u", ip2long($ip));

return (($ip_dec >= $lower_dec) && ($ip_dec <= $upper_dec));

}

return false;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值