php如何判断一个IP是否属于某个网段
2个回答
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家国内优质海外HTTP代理商,拥有一个庞大的IP资源池,覆盖200多个地区,IP数量大且匿名度高。其优点还包括超高并发、稳定高效、技术服务等特点,同时提供HTTP、HTTPS以及SOCKS5协议支持。此外,Sto...
点击进入详情页
本回答由Storm代理提供
展开全部
function h_fillbitsfromleft($num){
if ($num >= 8 ){
return(255);
}
$bitpat=0xff00;
while ($num > 0){
$bitpat=$bitpat >> 1;
$num--;
}
return($bitpat & 0xff);
}
function inIpSegment($ip, $ips) {
$ip = trim($ip);
$ips = trim($ips);
$ipArr = explode('/', $ips);
if ($ip === trim($ipArr[0])) return true;
if (count(explode('.', $ip)) != 4) return false;
$duan = 0;
if (isset($ipArr[1])) $duan = intval($ipArr[1]);
if ($duan <= 0 || $duan >= 32) return false;
$ipExpArr = explode('.', $ipArr[0]);
if (count($ipExpArr) != 4) return false;
$ip_1 = intval($ipExpArr[0]);
$ip_2 = intval($ipExpArr[1]);
$ip_3 = intval($ipExpArr[2]);
$ip_4 = intval($ipExpArr[3]);
if ($ip_1<0 || $ip_1>255) return false;
if ($ip_2<0 || $ip_2>255) return false;
if ($ip_3<0 || $ip_3>255) return false;
if ($ip_4<0 || $ip_4>255) return false;
$snm_1 = $duan >= 8*1 ? 255 : h_fillbitsfromleft($duan-8*1);
$snm_2 = $duan >= 8*2 ? 255 : h_fillbitsfromleft($duan-8*2);
$snm_3 = $duan >= 8*3 ? 255 : h_fillbitsfromleft($duan-8*3);
$snm_4 = $duan >= 8*4 ? 255 : h_fillbitsfromleft($duan-8*4);
$firstAdrArr = [];
$lastAdrArr = [];
$firstAdrArr[0] = $ip_1 & $snm_1;
$firstAdrArr[1] = $ip_2 & $snm_2;
$firstAdrArr[2] = $ip_3 & $snm_3;
$firstAdrArr[3] = $ip_4 & $snm_4;
$lastAdrArr[0] = $ip_1 | (~ $snm_1 & 0xff);
$lastAdrArr[1] = $ip_2 | (~ $snm_2 & 0xff);
$lastAdrArr[2] = $ip_3 | (~ $snm_3 & 0xff);
$lastAdrArr[3] = $ip_4 | (~ $snm_4 & 0xff);
if ($duan < 31) {
$firstAdrArr[3]++;
$lastAdrArr[3]--;
}
$i = 0;
foreach (explode('.', $ip) as $value) {
if ($value < $firstAdrArr[$i] || $value > $lastAdrArr[$i]) return false;
$i++;
}
return true;
}
// 使用
inIpSegment('192.168.1.1', '192.168.1.1/24');
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询