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

解决方案 »

  1.   

    楼上的兄弟,你写的正则是判断IP是否合法吧???
    我想要的是IP限制。。
    你跑题了。。
      

  2.   

    谢谢wfg2004()的建议
    不过我还是有点不甘心。。
    没有更好的解决方案了吗?
      

  3.   

    1、正则表达式不能完成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这样的形式