function _CheckIP($temptarget)
{
if(eregi("[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}", $temptarget))
{
$f = 1;
$detail = explode(".",$temptarget);
foreach($detail as $v)
{
if($v > 255 || $v < 0)
{
$f = 0;
break;
}
}
}
else $f =0;
return $f;
}
{
if(eregi("[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}", $temptarget))
{
$f = 1;
$detail = explode(".",$temptarget);
foreach($detail as $v)
{
if($v > 255 || $v < 0)
{
$f = 0;
break;
}
}
}
else $f =0;
return $f;
}
我想要的是IP限制。。
你跑题了。。
不过我还是有点不甘心。。
没有更好的解决方案了吗?
2、直接书写函数进行过滤在过滤范围发生变化时难以应付
3、当允许的范围包括若干个不连续的网段时,循环是必须的你可以这样做
<?php
/**
* 返回ip按指定掩码的网段地址
* 参数
* $ip 字符串,传入的ip地址
* $mask 任意,指定的掩码,数值 表示掩码长度,字符串表示用ip地址格式表示的掩码
**/
if(! function_exists('sonnet')):
function sonnet($ip, $mask=22) {
$ip = preg_replace("/(^|\.)0+(\d+)/", "$1$2", $ip);
if(long2ip(ip2long($ip)) != $ip) return false;
if(is_numeric($mask))
$mask = bindec(str_pad(decbin(pow(2, $mask)-1), 32, '0'));
else
$mask = ip2long($mask);
return long2ip(ip2long($ip) & $mask);
}
endif;$ip_pattern = array(
array('sonnet' => '61.128.0.0', 'mask' => 16,),
array('sonnet' => '61.138.0.0', 'mask' => 16,),
array('sonnet' => '220.171.0.0', 'mask' => 16,),
array('sonnet' => '218.84.0.0', 'mask' => 16,),
array('sonnet' => '218.31.0.0', 'mask' => 16,),
array('sonnet' => '222.80.0.0', 'mask' => 16,),
array('sonnet' => '222.81.0.0', 'mask' => 16,),
array('sonnet' => '222.82.0.0', 'mask' => 16,),
array('sonnet' => '222.83.0.0', 'mask' => 17,),
);$ips = array(
'61.128.0.3',
'61,130.4.5',
'220.171.10.0',
'220.172.0.0',
'218.84.0.3',
'218.82.250.100',
'222.80.1.1',
'222.79.255.254',
'222.81.0.1',
'222.82.129.255',
'222.83.10.2',
'222.83.128.1',
);
foreach($ips as $ip) {
$k = false;
foreach($ip_pattern as $p) {
if(sonnet($ip, $p['mask']) == $p['sonnet']) {
$k = true;
echo "$ip 允许<br>";
break;
}
}
if(! $k)
echo "$ip 不允许<br>";
}
?>
掩码也可以写作255.255.128.0这样的形式