Задать вопрос

В PHP можно указать диапазон IP?

Например нужно определить входит ли адрес посетителя сайта в диапазон 109.184.0.0 - 109.184.255.255 естественно без перебора.
  • Вопрос задан
  • 1138 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 2
miraage
@miraage
Старый прогер
https://gist.github.com/tott/7684443

/**
 * Check if a given ip is in a network
 * @param  string $ip    IP to check in IPV4 format eg. 127.0.0.1
 * @param  string $range IP/CIDR netmask eg. 127.0.0.0/24, also 127.0.0.1 is accepted and /32 assumed
 * @return boolean true if the ip is in this range / false if not.
 */
function ip_in_range( $ip, $range ) {
	if ( strpos( $range, '/' ) == false ) {
		$range .= '/32';
	}
	// $range is in IP/CIDR format eg 127.0.0.1/24
	list( $range, $netmask ) = explode( '/', $range, 2 );
	$range_decimal = ip2long( $range );
	$ip_decimal = ip2long( $ip );
	$wildcard_decimal = pow( 2, ( 32 - $netmask ) ) - 1;
	$netmask_decimal = ~ $wildcard_decimal;
	return ( ( $ip_decimal & $netmask_decimal ) == ( $range_decimal & $netmask_decimal ) );
}
Ответ написан
Комментировать
Melkij
@Melkij
PostgreSQL DBA
$ip = ip2long($_SERVER['REMOTE_ADDR']);
var_dump(ip2long('109.184.0.0') <= $ip and $ip <= ip2long('109.184.255.255'));


inet_pton по идее тоже сравнивается корректно и с поддержкой ipv6, но надо проверять.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
qualitat
@qualitat
Возьмите ip адрес посетителя, уберите два последних значения 255.255, получите 109.184, его и сравните.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы