我有一个国际电话号码列表和一个List of Country calling codes 我想从数字中识别国家,但我找不到快速而优雅的方式来做到这一点。
有什么想法吗?我唯一得到的是硬编码检查(例如,“查看第一个数字,查看第二个数字:如果是X则检查第三个数字。如果第二个数字是Y,则国家是Foo”等)。 我正在使用PHP和DB(MySQL)作为列表,但我认为任何伪代码都会有所帮助。
答案 0 :(得分:3)
或者,您可以使用http://docs.datamountaineer.com/en/latest/jms.html等工具。
使用Lookup发出API请求时,始终会返回CountryCode
属性。
[披露:我为Twilio工作]
答案 1 :(得分:1)
我是在追求类似的东西,但我也想确定地区/州 - 如果有的话。最后,我根据数字前导数字的树来破解某些东西(受到wikipedia处描述的刺激)
我的实施是available as a gist。
答案 2 :(得分:1)
我目前在Node中使用Google's libphonenumber的实现,效果相当不错。我想你可以尝试PHP实现,例如libphonenumber-for-php
答案 3 :(得分:0)
硬编码检查可以转换为从呼叫代码列表中自动生成的决策树。树的每个节点定义“当前”字符,可能的后续字符列表(树节点)或国家(如果它是终端节点)。根节点将用于前导'+'符号。
答案 4 :(得分:0)
这里的挑战是某些国家/地区共享相同的电话国家/地区代码。例如。加拿大和美国的电话号码都以+1开头。
我正在使用https://github.com/giggsey/libphonenumber-for-php,如下所示:
/**
* Get country
* @param string $phone
* @param string $defaultCountry
* @return string Country code, e.g. 'CA', 'US', 'DE', ...
*/
public static function getCountry($phone, $defaultCountry) {
try {
$PhoneNumberUtil = \libphonenumber\PhoneNumberUtil::getInstance();
$PhoneNumber = $PhoneNumberUtil->parse($phone, $defaultCountry);
$country = $PhoneNumberUtil->getRegionCodeForNumber($PhoneNumber);
return $country;
} catch (\libphonenumber\NumberParseException $e) {
}
return $defaultCountry;
}
答案 5 :(得分:-1)
您可以轻松地从第一个数字开始进行简单查找,然后从第二个数字开始,依此类推,直到找到它为止。这将正常工作,因为没有呼叫代码是另一个代码的前缀,即国际呼叫代码形成" prefix code" (电话系统依赖于此属性)。
我对PHP不擅长,所以这里是一个简单的python实现;希望很容易理解:
>>> phone_numbers = ["+12345", "+23456", "+34567", "+45678"]
>>> country_codes = { "+1": "USA", "+234": "Nigeria", "+34" : "Spain" }
>>> for number in phone_numbers:
... for i in [2, 3, 4]:
... if number[:i] in country_codes:
... print country_codes[number[:i]]
... break
... else:
... print "Unknown"
...
USA
Nigeria
Spain
Unknown
基本上你在前缀和国家之间有一个关联数组(我假设你可以从维基百科文章中轻松生成。你试着在关联数组中查找电话号码的第一个数字。如果它不在您尝试前两个数字的数组,然后是前三个数字。如果三个数字后没有匹配,则此数字不会以有效的国际呼叫代码开头。