在PHP中检索国家/地区代码

时间:2011-09-01 16:30:31

标签: php

我有点失落。

如何在一个php页面中检索访问者的ISO国家/地区代码?

感谢提前

5 个答案:

答案 0 :(得分: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 :(得分:1)

我认为你可以使用这个使用ip的php脚本打印出一个国家代码

实施例

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

提供US

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

答案 2 :(得分:1)

发现这个,可能是有用的。 点击http://ipinfodb.com/ip_location_api.php

答案 3 :(得分: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;
}

答案 4 :(得分: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' ) );