PHP-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]?dd?).).*w*(*)$}';//后面带*的模糊范围判断 正则
$config['ipPreg'][1] = '{((2[0-4]d|25[0-5]|[01]?dd?).).*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'));
//这是我今天接触到的一个问题,求指点 求优化 求指出不足,感觉有点不妥....
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我觉得最大的不足是注释写得不好
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();
}
整个大结构会看起来比较一目了然,不然等两个月你再重新读读这个代码看是不是很快可以明白哪块在干什么