如何匹配数组中的部分字符串 - PHP

时间:2015-10-18 09:25:52

标签: php arrays regex

有没有办法在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;

感谢您对此提供任何帮助。

2 个答案:

答案 0 :(得分:1)

首先检查ip格式。构建两个不同的阵列,一个用于完整ip地址,另一个用于子网。一个示例类(随意使其符合PSR-2,因为您使用PHP 5.6,您也可以将两个数组声明为类常量而不是静态变量):

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
    LinearLayout mL = (LinearLayout)findViewById(R.id.MainLayout);
    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    int width = size.x;
    int height = size.y;

    if (Build.VERSION.SDK_INT >= 16) {
        Drawable d = new BitmapDrawable(getResources(),
                BitmapDecoder.decodeSampledBitmapFromResource(getResources(),
                        R.drawable.andromeda,
                        1080,1920));
        mL.setBackground(d);
    }

    this.getSupportActionBar().hide();
}

你可以像这样使用它:

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

答案 1 :(得分:0)

您可以使用in_array检查字符串是否存在于数组中

http://php.net/manual/en/function.in-array.php