我正在使用MaxMind的免费GeoLite2数据库。
根据他们的代码,我可以得到该国的ISO代码。print($record->country->isoCode . "n"); // 'US'
但是我如何获得大陆代码? 我更具体地寻找欧盟检测。
EU
欧盟(欧盟(国家名单是:
- 奥地利 AT 公司
- 比利时, 比利时
- BG, 保加利亚
- CR, 克罗地亚
- 塞浦路斯共和国
- 捷克, 捷克共和国
- 丹麦, 丹麦
- EE, 爱沙尼亚
- FI, 芬兰
- 法国, 法国
- 德国, 德国
- 希腊 GR
- HU, 匈牙利
- IE, 爱尔兰
- 意大利, 意大利
- LV, 拉脱维亚
- LI, 立陶宛
- LU, 卢森堡
- MT, 马耳他
- 荷兰, 荷兰
- 波兰
- 葡萄牙
- 罗马尼亚 RO
- SK, 斯洛伐克
- SI, 斯洛文尼亚
- SP, 西班牙
- 瑞典东南
- GB, 英国
我使用的示例:
if (isset($_SERVER['GEOIP_COUNTRY_CODE'])) {
$cc=$_SERVER['GEOIP_COUNTRY_CODE'];
} else {
$cc='??';
}
$eu=array('AT', 'BE', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR', 'DE', 'GR', 'HU', 'IE', 'IT', 'LV', 'LT', 'LU', 'MT', 'NL', 'PL', 'PT', 'RO', 'SK', 'SI', 'SP', 'SE', 'GB');
if (in_array($cc,$eu)) {
//inside EU
} else {
//outside EU
}
欧洲经济区
根据您要执行的操作(考虑到这是在GDPR可执行后提出的(,您可能需要测试EEA(欧洲经济区(。
欧洲经济区是:
- 所有欧盟成员国
- 否, 挪威
- IS, 冰岛
- LI, 列支敦士登
这是我与完整地理IP一起使用的:
if (isset($_SERVER['GEOIP_COUNTRY_CODE'])) {
$cc=$_SERVER['GEOIP_COUNTRY_CODE'];
} else {
$cc='??';
}
$eea=array('AT', 'BE', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR', 'DE', 'GR', 'HU', 'IE', 'IT', 'LV', 'LT', 'LU', 'MT', 'NL', 'PL', 'PT', 'RO', 'SK', 'SI', 'SP', 'SE', 'GB', 'NO', 'IS', 'LI');
if (in_array($cc,$eea)) {
//inside EEA
} else {
//outside EEA
}
特殊情况
您需要处理一些特殊情况,具体取决于您的预期用途是否包括在内:
欧盟的一部分,但有自己的ISO 2字母代码
- 地理标志, 直布罗陀 (~英国(
- AX, 奥兰群岛 (~芬兰(
请注意,还有更多这样的,但它们没有自己的 ISO 国家代码......
这些部分是欧盟和欧洲经济区的一部分,并有自己的2个字母的国家代码。
最外围地区
- GF, 法属圭亚那 (~法国(
- GP, 瓜德罗普岛 (~法国(
- MQ, 马提尼克岛 (~法国(
- YT, 马约特岛 (~法国(
- RE, 留尼汪岛 (~法国(
- MF, 圣马丁 (~法国(
这些变得复杂,你应该真正阅读每一个,因为你试图定义欧盟的具体原因,如果他们在里面还是在外面。另请注意,如果没有那么多的新闻报道,这些有时会发生变化。
海外国家和地区
还有更多这样的,但对于大多数用例,它们不应被视为欧盟的一部分,如果您有特定原因,仍然要检查它们。
飞地
这些往往没有自己的国家代码,但有时出于某些目的,仍然可以对它们应用不同的规则。
例如,德国或西班牙的孤立部分,但位于瑞士或摩洛哥境内。
欧洲自由贸易联盟
为完整起见:瑞士(CH(既不是欧盟成员也不是欧洲经济区的成员,但它是EFTA(欧洲自由贸易联盟(的成员。
微状态
列支敦士登是欧洲经济区的成员,但还有一些既不是欧盟也不是欧洲经济区的一部分。尽管如此,出于实际原因,他们确实有各种关系。 与欧盟(例如成为欧元区的一部分,在申根区内,收取增值税等(
- 公元, 安道尔
- LI, 列支敦士登
- MC, 摩纳哥
- SM, 圣马力诺
- VC, 梵蒂冈城
大陆
如果您确实在寻找欧洲大陆,您将需要添加更多国家/地区,并且您将不得不与不仅仅在欧洲的国家(例如土耳其,俄罗斯(打交道。
麦克斯迈德的"欧盟"国家代码
Maxmind有时在无法确定实际是哪个国家时使用国家代码"EU"。这个"欧盟"指的是欧洲,而不是欧盟(欧盟国家代码实际上是保留的(。
更多信息:
https://en.wikipedia.org/wiki/Special_member_state_territories_and_the_European_Union https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 https://en.wikipedia.org/wiki/Microstates_and_the_European_Union https://dev.maxmind.com/faq/what-are-the-eu-europe-and-ap-asia-pacific-entries/
如果您只是在寻找该国是否是欧盟成员国,MaxMind 提供以下内容:
$record->country->isInEuropeanUnion
如果你想要大陆代码,你可以通过以下方式获得:
$record->continent->code
但是,请注意,并非所有欧洲国家都是欧盟的一部分。