如何通过PHP检测中东访客?

4
我希望您能提供一种明确的方法来检测访问者是否来自中东。 如果是,我需要显示不同的标题图像(当前的图像中有一只猪,所以它被认为是不合适的)。
我可以编写if then else代码,但我只是在寻找一个简单的函数来进行检测。 这是一个我用过的根据IP获取国家的函数:
function get_country_by_ip($ip){

    if(!$ip) return false;    # Missing parameter

    # Pull the XML
    $url = 'http://api.hostip.info/?ip='.$ip;
    $xml = simplexml_load_file($url);

    # Parse the data and store into array
    $citystate = explode(", ", $xml->children('gml', true)->featureMember->children()->Hostip->children('gml', true)->name);
    $result['city'] = $citystate[0];
    $result['state'] = $citystate[1];
    $result['country'] = $xml->children('gml', true)->featureMember->children()->Hostip->countryName;
    $result['country_abbr'] = $xml->children('gml', true)->featureMember->children()->Hostip->countryAbbrev;

    return (object) $result;

}

有人可以帮忙吗?谢谢。


如果您已经知道了上述国家信息,那么问题在哪里?但这仍不能保证您对该国家的权利。 - user557846
7
亚太地区的穆斯林人数是中东/北非的三倍。请参见 维基百科 - Larry K
3个回答

2
您可以定义哪些国家属于“中东”组 - 通过直接在PHP文件或数据库中定义可配置数组,然后检查您的函数返回的给定国家是否属于“中东”国家列表。根据您的示例,类似于以下内容:
$middleEast = array(
 'Syria',
 'Iraq',
 ... // all the rest
);

$country = get_country_by_ip($ip);

if (in_array($country['country'], $middleEast) {
 echo 'Middle East!';
 exit;
}

5
日本和中国被认为是中东的一部分是从什么时候开始的? - user557846
将其与远东混淆了,但这是否与建议的方法有关? - ddinchev
我本来不想这样做,希望能够动态确定区域,但这个方法非常完美。我会在另一个回复中发布代码。 - hatfieldajoshua

1
<?php

/* get country by ip */

function get_country_by_ip($ip){

    if(!$ip) return false;

    /* pull the xml */

    $url = 'http://api.hostip.info/?ip='.$ip;
    $xml = simplexml_load_file($url);


    /* parse the data and store into array */

    $citystate = explode(", ", $xml->children('gml', true)->featureMember->children()->Hostip->children('gml', true)->name);

    $result['city'] = $citystate[0];
    $result['state'] = $citystate[1];

    $result['country'] = (array) $xml->children('gml', true)->featureMember->children()->Hostip->countryName;
    $result['country'] = $result['country'][0];

    $result['country_abbr'] = (array) $xml->children('gml', true)->featureMember->children()->Hostip->countryAbbrev;
    $result['country_abbr'] = $result['country_abbr'][0];

    return (object) $result;

}


/* get country */

$geo_info = get_country_by_ip($_SERVER['REMOTE_ADDR']);


/* MENA countries */

$mena = array(

    'ALGERIA',

    'BAHRAIN',

    'EGYPT',

    'IRAN',

    'IRAQ',

    'ISRAEL',

    'JORDAN',

    'KUWAIT',

    'LEBANON',

    'LIBYA',

    'MOROCCO',

    'OMAN',

    'PALESTINE',

    'QATAR',

    'SAUDI ARABIA',

    'SYRIA',

    'TUNISIA',

    'UNITED ARAB EMIRATES',

    'YEMEN',

    'ARMENIA',

    'AZERBAIJAN',

    'CYPRUS',

    'DJIBOUTI',

    'MALTA',

    'MAURITANIA',

    'SAHRAWI ARAB DEMOCRATIC REPUBLIC',

    'SOMALIA',

    'SUDAN',

    'TURKEY',

);


/* image with a hog */

$img = 'mmm-pork.jpg';

if(in_array($geo_info->country, $mena)){


    /* image with no hog */

    $img = 'cant-have-pork.jpg';

} ?>

0

我从未使用过那项服务,但我使用过免费的GeoIP(GeoLite Country)数据库。如果您保持其更新,那么您不太可能遇到太多问题。 - crmpicco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接