2015-10-18 121 views
0

有没有办法在PHP中匹配数组中的一部分字符串?如何匹配数组中的字符串的一部分 - PHP

我想验证用户IP对允许的IP。因此我创建了一个包含IP和数字对应的partner_id的数组。这可以工作,但是我也想允许整个子网,因此需要对阵部分阵列。这可能吗?

这是我的代码:

# define partner IPs 
$partner_ips = array(
         '192.168.56.1'  => 0, // dev 
         '192.168.57.*'  => 1 // office ips      
); 
# test for partner IP and associate partner_id if found 
if (array_key_exists($_SERVER['REMOTE_ADDR'], $partner_ips)) 
    $partner_id = $partner_ips[$_SERVER['REMOTE_ADDR']]; 
else 
    $partner_id = false; 

感谢您有这方面的帮助。

+1

看看PHP的数组函数。尤其是具有回调功能的'array_walk()'函数。 – arkascha

+0

什么是您的PHP版本? –

+0

我的PHP版本是5.6。* – merlin

回答

1

首先检查IP格式可以使用in_array进行检查。构建两个不同的阵列,一个用于完整的IP地址,另一个用于子网。一个例子类(随意让它PSR-2兼容,因为你使用PHP 5.6,你也可以声明两个数组为类的常量,而不是静态变量):

class RemoteAddress { 

    private $ip; 
    private $id; 

    private static $partners_ips = [ 
      '192.168.56.1' => 0, 
      '192.168.58.4' => 2, 
      '192.168.59.2' => 3 ]; 

    private static $partners_subnets = [ // note that subnets must end with a dot 
      '192.168.57.' => 1, 
      '192.168.60.' => 4, 
      '192.168.61.' => 5 ]; 

    public function __construct($ip) { 
     if (filter_var($ip, FILTER_VALIDATE_IP) === false) 
      throw new Exception("invalid IP address"); 

     $this->ip = $ip; 
     $this->id = $this->searchID(); 
    } 

    public function getIDPartner() { 
     return $this->id; 
    } 

    private function searchID() { 
     if (array_key_exists($this->ip, self::$partners_ips)) 
      return self::$partners_ips[$this->ip]; 

     foreach (self::$partners_subnets as $subnet => $id) { 
      if (strpos($this->ip, $subnet) === 0) 
       return $id; 
     } 

     return false; 
    } 
} 

您可以使用它像这样:

try { 
    if (isset($_SERVER['REMOTE_ADDR'])) { 
     $remAddr = new RemoteAddress($_SERVER['REMOTE_ADDR']); 
     var_dump($remAddr->getIDPartner()); 
    } else throw new Exception('$_SERVER[\'REMOTE_ADDR\'] is not defined'); 
} catch(Exception $e) { 
    echo $e->getMessage(); 
} 
相关问题