php IP判断网段 相关问题望指出不足


   
  function ipv4_in_range ($remote, $begin, $end = null)
  
{
// 10.0.0.0 ~ 10.0.255.255
// 10.0.2.100 ~ 10.0.2.140
$config['ipPreg'][0] = '{((2[0-4]\d|25[0-5]|[01]?\d\d?)\.).*\w*(\*)$}';//后面带*的模糊范围判断 正则
$config['ipPreg'][1] = '{((2[0-4]\d|25[0-5]|[01]?\d\d?)\.).*\w*(\/)?\d$}';//后面带\d的判断 正则
if (empty($remote) || empty($begin)) return false;
if (preg_match($config['ipPreg'][0], $begin)&&empty($end))
{
$begin = substr($begin, 0, strrpos($begin, '.')) . '.1';
$end = substr($begin, 0, strrpos($begin, '.')) . '.255';
}
if (preg_match($config['ipPreg'][1], $begin)&&empty($end))
{

$tmpstr = explode('/', $begin);
$beginStr=$tmpstr[0];
$ipmask=$tmpstr[1];
for($i = 0;$i < 4;$i++)//组合成一个
{
if ($ipmask == 0)
{
$masklist[$i] = 0;
} elseif ($ipmask < 8)
{
$masklist[$i] = bindec(str_pad(str_pad('', $ipmask, '1', STR_PAD_RIGHT), 8, '0', STR_PAD_RIGHT));
//返回十进制码
$ipmask = 0;
}
else
{
$masklist[$i] = 255;
$ipmask -= 8;
}
}
$remoteList = explode('.', $remote);
$beginList = explode('.', $beginStr);
for($i=0;$i<4;$i++) {//逐个判断对应的元素 以此判断网络标识
if($masklist[$i]==255) {//255.xxx.xx.xx or 255.255.xx.xx 类 B类 255.255.255.xx C类
if($remoteList[$i]!=$beginList[$i]) {
return false;
}
}
elseif($masklist[$i]==0) {
//continue;
}
else {
if(($beginList[$i] & $remoteList[$i] & $masklist[$i]) != $beginList[$i]) {
return false;
}
}
}
return true;
}

$remoteIp = ip2long($remote);//ip 转为整数以此判断取值范围
if ($remoteIp >= ip2long($begin) && $remoteIp <= ip2long($end))
{
return true;
}
return false;
}

/* 调用方式如下 */
assert(ipv4_in_range('10.0.1.123','10.0.1.0', '10.0.1.255'));
assert(ipv4_in_range('10.0.1.123','10.0.1.*'));
assert(ipv4_in_range('10.0.1.123','10.0.1.0/24'));
assert(ipv4_in_range('10.0.1.123','10.0.1.1**'));
assert(ipv4_in_range('10.0.1.123','10.0.1.*/24'));
//这是我今天接触到的一个问题,求指点 求优化 求指出不足,感觉有点不妥....

php http协议

rabket 10 years, 5 months ago

我觉得最大的不足是注释写得不好

   
  function() {
  
// 把10.0.1.* 转换为 10.0.1.1 和 10.0.1.255
doSomeThing();

// 把10.0.1.0/24 转换为 10.0.1.1 和 10.0.1.255
doOtherThing();
}

整个大结构会看起来比较一目了然,不然等两个月你再重新读读这个代码看是不是很快可以明白哪块在干什么

eszeta answered 10 years, 5 months ago

Your Answer