如何匹配数组中的字符串的一部分 - PHP
问题描述:
有没有办法在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;
感谢您有这方面的帮助。
答
首先检查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();
}
看看PHP的数组函数。尤其是具有回调功能的'array_walk()'函数。 – arkascha
什么是您的PHP版本? –
我的PHP版本是5.6。* – merlin