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

发布于 2016-10-18 17:33:16 字数 2636 浏览 1038 评论 1

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

泛泛之交 2017-03-31 08:08:19

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

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();
}

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文