Определение страны по IP на PHP



Получать информацию по IP мы будем с этого сайта.

function getCountryByIp($ipAddress)
{
	$ipDetail=array();
	$f = file_get_contents("http://api.hostip.info/?ip=".$ipAddress);
	
	//Получаем название города
	preg_match("@<Hostip>(\s)*<gml:name>(.*?)</gml:name>@si", $f, $city);
	$ipDetail['city'] = $city[2]; 
	
	//Получаем название страны
	preg_match("@<countryName>(.*?)</countryName>@si", $f, $country);
	$ipDetail['country'] = $country[1];
	
	//Получаем код страны
	preg_match("@<countryAbbrev>(.*?)</countryAbbrev>@si", $f, $countryCode);
	$ipDetail['countryCode'] = $countryCode[1];
	
	return $ipDetail;
}

Я думаю код в объяснениях не нуждается. Функция будет возвращать такой массив:

Array ( [city] => cityName [country] => countryName [country_code] => Code )

Теперь посмотрим работу функции getCountryByIp() в деле.

$ipDetail = getCountryByIp('195.114.140.105');
echo "Страна: ".$ipDetail['country']."<br />";
echo "Город: ".$ipDetail['city']."<br />";
echo "Код страны: ".$ipDetail['countryCode']."<br />";

По использованному выше будет следующая информация:

Страна: FRANCE
Город: Nice
Код страны: FR



Теги: ,

Комментарии

  1. Супер! На редкость понятная статья. За 2 минуты настроил у себя на сервере. Респект автору. Всё понятно и чётко

    Reply

  2. А вот с российскими IP проблема на этом сервисе — не определяют. «… actually we haven’t a clue.»

    Reply

  3. У меня вот что определяет: 66.249.66.233 — (Private A * не определ * XX *
    , т.е. ничего. И так по всем ip
    , google и yandex не исключение. Что не так…

    Reply

  4. Челябинск UTEL к сожалению не определил

    Reply

  5. Спасибо, клево, я думал надо свои базы где то находить, и по ним работать, про hostip не знал 🙂

    Reply

  6. А вот нихера и не работает Ваш код — фуфло, город не определяет

    Reply

    Max Reply:


    Прежде, чем говорить, что код нерабочий посмотри на дату поста. В 2009 году все работало. За 3 года могло многое измениться.

    Reply

  7. нужно исправить
    preg_match(«@(\s)*(.*?)@si», $f, $city);
    $ipDetail[‘city’] = $city[2];

    на preg_match(«@(\s)*(.*?)@si», $f, $city);
    $ipDetail[‘city’] = $city[2];

    Тогда работать будет и еще, странная у вас антиспам система, одно и тоже выражение предлагает мне

    Reply

  8. Мне бы такое на Delphi… Кто нить знает как реализовать (главное, что бы страну определял, остальное наважно)

    Reply

  9. Много айпи не определят….не пойдет

    Reply

Оставить комментарий