Для начала
http://www.arin.nethttp://www.ripe.nethttp://lacnic.net/http://www.apnic.net/На все сервисы можно обращаться сколько угодно, у них нет ограничений.
Самая нормально выводимая информация это у arin.net
легко выделяется штат и город, но и там бывают непредсказуемые случаи...
<?php
$city_ru[1] = "St.Petersburg";
$city_ru[2] = "Moscow";
$city_ru[3] = "Ekaterinburg";
$city_ru[4] = "Saint-Petersburg";
$city_ru[5] = "Chelyabinsk";
$city_ru[6] = "Nizhny Novgorod";
$city_ru[7] = "Samara";
$city_ru[8] = "Rostov-on-Don";
$city_ru[9] = "Miass";
$city_ru[10] = "Izhevsk";
$city_ru[11] = "Krasnodar";
$city_ru[12] = "Tomsk";
$city_ru[13] = "Taganrog";
$city_ru[14] = "Vladivostok";
$city_ru[15] = "Omsk";
$city_ru[16] = "Irkutsk";
$city_ru[17] = "Shadrinsk";
$city_ru[18] = "Tver";
$city_ru[19] = "Novosibirsk";
$city_ru[20] = "St. Petersburg";
$city_ru[21] = "Astrakhan";
$city_ru[22] = "Surgut";
$city_ru[23] = "Tatarstan";
$city_ru[24] = "Kaliningrad";
$city_ru[25] = "Perm";
$city_ru[26] = "Syktyvkar";
$city_ru[27] = "Ufa";
$city_ru[28] = "Voronezh";
$city_ru[29] = "Arkhangeslk";
$city_ru[30] = "Kursk";
if ($ip!="")
{
$sock=fsockopen ("whois.ripe.net",43,$errno,$errstr);
if(!$sock)
{
}
else
{
fputs ($sock,$ip."\\r\\n");
while(!feof($sock))
{
$str[$i++] = fgets($sock,1024);
}
}
fclose ($sock);
}
for($a = 0; $a <= count($str); $a++)
{
for($s = 1; $s <= count($city_ru); $s++)
{
$strr[] = substr(strstr($str[$a],$city_ru[$s]),0,strlen($city_ru[$s]));
}
}
$strr = array_values(array_unique($strr));
if($strr[1] == "Saint-Petersburg" || $strr[1] == "St. Petersburg")
{
$strr[1] = "St.Petersburg";
}
$city = strtolower($strr[1]);
?>
это для россии, но и в нем есть глюки...
но все равно попадаются странности...