Вывод определённого текста списку IP адресов на PHP

lomster7
На сайте с 09.05.2011
Offline
84
941

Всем привет, есть список IP адресов в формате:

175.40.0.0-175.40.255.255
58.68.0.0-58.68.127.255
27.248.0.0-27.248.255.255
49.136.0.0-49.138.255.255
101.208.0.0-101.223.255.255

нужно вывести текст используя PHP язык этим IP'адресам, а всем остальным другой текст.

была реклама, а уже нету :)
K
На сайте с 03.06.2015
Offline
45
#1

Надо забить адреса в двумерный массив как числа и искать там пересечение с адресом юзера.


foreach($ips as $ip) {
if($user_ip >= $ip[0] && $user_ip <= $ip[1])
return 1;

Я не знаю в каком виде у вас этот список, поэтому не могу предложить способ как его превратить в массив. Может он уже в массиве, например в бд.

Адрес в число со знаком - ip2long()

---------- Добавлено 21.08.2015 в 21:19 ----------

Похожая тема http://stackoverflow.com/questions/10421613/match-ipv4-address-given-ip-range-mask

MYSQL PHP JS HTML CSS SEO TXT США СССР
lomster7
На сайте с 09.05.2011
Offline
84
#2

В программировании не понимаю, хотелось бы готовый код.

Если очень сложно, можно за деньги

M
На сайте с 26.11.2008
Offline
51
#3
lomster7:
В программировании не понимаю, хотелось бы готовый код.
Если очень сложно, можно за деньги

У вас список большой и постоянно меняется? Или нифига не меняется и небольшое количество IP?

Если список предполагается, что будет меняться или большое количество IP, тогда заносите в файл в формате

175.40.0

58.68.0

27.248.0

49.136.0

101.208.0

Если третья цифра всегда 0, то можно в формате

175.40

58.68

поскольку вам нужно только совпадение первых двух.

Как то так

Пишем функцию

function GetTextbyIP() {


$ipaddr = $_SERVER['REMOTE_ADDR'];
$exp_ip = explode(".", $ipaddr);
$ip1 = $exp_ip[0];
$ip2 = $exp_ip[1];

$fl = FILE('ips.txt');
for($i=0; $i<count($fl); $i++)
{
$exp_file = explode(".", $fl[$i]);
if($exp_file[0] == $ip1 && $exp_file[1] == $ip2) { $fou = TRUE; break;}
}
if($fou) return TRUE;
else return FALSE;
}

Ну и где нить проверяем где надо.

if(GetTextbyIP()) echo "нужный текст";

else echo "обычный текст";

Update

Заметил, что у вас по второй цифре возможен диапазон. Ну тогда допишите в файл лишние пару строк.

49.136.

49.137.

49.138.

Или адаптировать код под диапазон

Веб программирование, создание плагинов под любые CMS, разработка сайтов с нуля, помочь в настройке хостинга и переездах, очистка от вирусов и другие услуги для ваших проектов (http://www.maxgal.com)
alexvaleev
На сайте с 04.02.2010
Offline
55
#4

Есть хорошая функция для определения принадлежности ip диапазону.

В вашем случае код будет выглядеть примерно так:

<?

function decbin32 ($dec) {
return str_pad(decbin($dec), 32, '0', STR_PAD_LEFT);
}
// ip_in_range
// This function takes 2 arguments, an IP address and a "range" in several
// different formats.
// Network ranges can be specified as:
// 1. Wildcard format: 1.2.3.*
// 2. CIDR format: 1.2.3/24 OR 1.2.3.4/255.255.255.0
// 3. Start-End IP format: 1.2.3.0-1.2.3.255
// The function will return true if the supplied IP is within the range.
// Note little validation is done on the range inputs - it expects you to
// use one of the above 3 formats.
function ip_in_range($ip, $range) {
if (strpos($range, '/') !== false) {
// $range is in IP/NETMASK format
list($range, $netmask) = explode('/', $range, 2);
if (strpos($netmask, '.') !== false) {
// $netmask is a 255.255.0.0 format
$netmask = str_replace('*', '0', $netmask);
$netmask_dec = ip2long($netmask);
return ( (ip2long($ip) & $netmask_dec) == (ip2long($range) & $netmask_dec) );
} else {
// $netmask is a CIDR size block
// fix the range argument
$x = explode('.', $range);
while(count($x)<4) $x[] = '0';
list($a,$b,$c,$d) = $x;
$range = sprintf("%u.%u.%u.%u", empty($a)?'0':$a, empty($b)?'0':$b,empty($c)?'0':$c,empty($d)?'0':$d);
$range_dec = ip2long($range);
$ip_dec = ip2long($ip);

# Strategy 1 - Create the netmask with 'netmask' 1s and then fill it to 32 with 0s
#$netmask_dec = bindec(str_pad('', $netmask, '1') . str_pad('', 32-$netmask, '0'));

# Strategy 2 - Use math to create it
$wildcard_dec = pow(2, (32-$netmask)) - 1;
$netmask_dec = ~ $wildcard_dec;

return (($ip_dec & $netmask_dec) == ($range_dec & $netmask_dec));
}
} else {
// range might be 255.255.*.* or 1.2.3.0-1.2.3.255
if (strpos($range, '*') !==false) { // a.b.*.* format
// Just convert to A-B format by setting * to 0 for A and 255 for B
$lower = str_replace('*', '0', $range);
$upper = str_replace('*', '255', $range);
$range = "$lower-$upper";
}

if (strpos($range, '-')!==false) { // A-B format
list($lower, $upper) = explode('-', $range, 2);
$lower_dec = (float)sprintf("%u",ip2long($lower));
$upper_dec = (float)sprintf("%u",ip2long($upper));
$ip_dec = (float)sprintf("%u",ip2long($ip));
return ( ($ip_dec>=$lower_dec) && ($ip_dec<=$upper_dec) );
}

echo 'Range argument is not in 1.2.3.4/24 or 1.2.3.4/255.255.255.0 format';
return false;
}
}


$r = array(
"175.40.0.0-175.40.255.255",
"58.68.0.0-58.68.127.255",
"27.248.0.0-27.248.255.255",
"49.136.0.0-49.138.255.255",
"101.208.0.0-101.223.255.255",
);
$i = $_SERVER["REMOTE_ADDR"];
$b_found = false;
foreach ($r as $range) {
if(ip_in_range($i,$range)) {
$b_found = true;
break;
}
}
Блог (http://alexvaleev.ru) Всем роуп! (https://rujump.ru/)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий