How to match part of string inside array - PHP

75

Is there a way to match a part of a string within an array in PHP?

I would like to validate a user ip against allowed IPs. Therefore I have created an array with IPs and coresponding partner_id. This works, however I also want to allow an entire subnet and would therefore need to mach against part of the array. Is this possible?

This is my code:

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

Thank you for any help on this.

841

Answer

Solution:

Check the ip format first. Build two different arrays, one for full ip adresses and one for subnets. An example class (feel free to make it PSR-2 compliant, since you use PHP 5.6 you can also declare the two arrays as class constants instead of static variables):

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

You can use it like this:

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();
}
416

Answer

Solution:

You can use in_array for check if your string exist in array or not

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

People are also looking for solutions to the problem: php - I can't get my redirect to work if the user's ip is in the database

Source

Didn't find the answer?

Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.

Ask a Question

Write quick answer

Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.

Similar questions

Find the answer in similar questions on our website.