我有点失落。
如何在一个php页面中检索访问者的ISO国家/地区代码?
感谢提前
答案 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)
答案 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' ) );