2011-09-01 82 views
1

我有點迷路了。檢索國家代碼在PHP

如何在一個php頁面中檢索訪問者的ISO國家代碼?

感謝推進

+0

的[PHP代碼從IP查詢國家]可能重複(HTTP:/ /stackoverflow.com/questions/3378318/php-code-to-check-country-from-ip) –

回答

1

我想你可以使用它使用IP,並打印出一個國家代碼

例子這個PHP腳本

http://api.hostip.info/country.php?ip=4.2.2.2

給人US

退房 http://www.hostip.info/use.html 更多信息。

2

您可以通過IP的地理定位或通過檢查正確的標題來完成此操作。

通常你需要後者,因爲它告訴你瀏覽器/系統使用哪種語言。當你想知道物理位置時,你只想使用地理位置。 標題存儲在$_SERVER['HTTP_ACCEPT_LANGUAGE']。它包含逗號分隔的條目,例如:en-GB,en;q=0.8,en-US;q=0.6,nl;q=0.4(我自己的)

HTTP Accept Language參數用逗號分隔它的語言,它的屬性由分號表示。 q值從0到1,其中1是最高的/最優選的。下面是一些天真的和未經考驗的代碼來解析它:

$langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); 
$preffered = ""; 
$prefvalue = 0; 
foreach($langs as $lang){ 
    $info = explode(';', $lang); 
    $val = (isset($lang[1])?$lang[1];1); 
    if($prefvalue < $val){ 
     $preferred = $lang[0]; 
     $prefvalue = $val; 
    } 
} 

簡單多了是,如果你想測試一個特定的語言被接受,例如西班牙文:

if(strpos($_SERVER['HTTP_ACCEPT_LANGUAGE'], "es") !== false){ 
    // Spanish is supported 
} 
1

我自己使用的一個庫,可以推薦,是MaxMind GeoLite Country。要獲取國家代碼,您只需要將2個文件複製到您的服務器,即php代碼geoip.inc和二進制數據GeoIP.dat

使用該庫也非常簡單:

function ipToCountry() 
{ 
    include_once('geoip/geoip.inc'); 

    $gi = geoip_open(__DIR__ . '/geoip/GeoIP.dat', GEOIP_STANDARD); 
    $result = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']); 
    geoip_close($gi); 

    return $result; 
} 
0

這將使用GEOIP並回落到accept_lang

class Ip2Country 
{ 
    function get($target) 
    { 
     $country = false; 
     if(function_exists('geoip_record_by_name')) 
      $country = $this->getFromIp($target); 
     if(!$country && isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) 
      $country = $this->getFromLang($_SERVER['HTTP_ACCEPT_LANGUAGE']); 
     return $country; 
    } 

    function getFromIp($target) 
    { 
     $dat = @geoip_record_by_name($target); 
     return (isset($dat['country_code'])) ? mb_strtolower($dat['country_code']) : false; 
    } 

    function getFromLang($str) 
    { 
     $info = array(); 
     $langs = explode(',', $str); 
     foreach($langs as $lang) 
     { 
      $i = explode(';', $lang); 
      $j = array(); 
      if(!isset($i[0])) continue; 
      $j['code'] = $i[0]; 
      if(strstr($j['code'], '-')) 
      { 
       $parts = explode('-', $j['code']); 
       $j['lang'] = $parts[0]; 
       $j['country'] = mb_strtolower($parts[1]); 
      } 
      $info[] = $j; 
     } 
     return (isset($info[0]['country'])) ? $info[0]['country'] : false; 
    } 
} 

$x = new Ip2Country(); 
var_dump($x->get('canada.ca'));