如何从标准化的电话号码中识别国家/地区?

时间:2010-12-20 22:56:05

标签: phone-number country-codes

我有一个国际电话号码列表和一个List of Country calling codes 我想从数字中识别国家,但我找不到快速而优雅的方式来做到这一点。

有什么想法吗?我唯一得到的是硬编码检查(例如,“查看第一个数字,查看第二个数字:如果是X则检查第三个数字。如果第二个数字是Y,则国家是Foo”等)。 我正在使用PHP和DB(MySQL)作为列表,但我认为任何伪代码都会有所帮助。

6 个答案:

答案 0 :(得分:3)

或者,您可以使用http://docs.datamountaineer.com/en/latest/jms.html等工具。

使用Lookup发出API请求时,始终会返回CountryCode属性。

Twilio Lookup

[披露:我为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

基本上你在前缀和国家之间有一个关联数组(我假设你可以从维基百科文章中轻松生成。你试着在关联数组中查找电话号码的第一个数字。如果它不在您尝试前两个数字的数组,然后是前三个数字。如果三个数字后没有匹配,则此数字不会以有效的国际呼叫代码开头。