Оптимизированный метод сравнения IP-адресов с подстановочными знаками в PHP?

Кто-нибудь знает эффективный и безопасный метод, чтобы проверить, совпадает ли этот input:

$_SERVER['REMOTE_ADDR']

с чем-то похожим на этот массив несовместимых фильтров (обратите внимание, что 200.100. *. * может быть выражено просто как 200.100. *) с подстановочными знаками, обозначенными *:

array(
  '192.168.1.*',
  '192.168.2.1*',
  '10.0.0.*',
  '200.100.*.*',
  '300.200.*',
)

Обновление

Мысли?

foreach($instanceSettings['accessControl']['allowedIpV4Addresses'] as $ipV4Address) {
    echo 'Now checking against '.$ipV4Address.'.';

    // Compare each octet
    $ipV4AddressOctets = String::explode('.', $ipV4Address);
    $remoteIpV4AddressOctets = String::explode('.', $_SERVER['REMOTE_ADDR']);
    $remoteIpV4AddressIsAllowed = true;
    for($i = 0; $i < Arr::size($ipV4AddressOctets); $i++) {
        echo 'Comparing '.$ipV4AddressOctets[$i].' against '.$remoteIpV4AddressOctets[$i].'.';
        if($ipV4AddressOctets[$i] != $remoteIpV4AddressOctets[$i] && $ipV4AddressOctets[$i] != '*') {
            echo 'No match.';
            $remoteIpV4AddressIsAllowed = false;
            break;
        }
    }

    // Get out of the foreach if we've found a match
    if($remoteIpV4AddressIsAllowed) {
        break;
    }
}
8
задан Kirk Ouimet 30 September 2011 в 17:50
поделиться