2015-10-18 83 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(); 
}