3

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

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

4

6 回答 6

4

或者,您可以使用Twilio Lookup 之类的工具。

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

https://www.twilio.com/docs/api/lookups#lookups-instance-properties

[披露:我为 Twilio 工作]

于 2016-08-18T23:03:14.947 回答
2

我追求与此类似的东西,但我也想确定地区/州 - 如果有的话。最后,我根据数字前导数字树破解了一些东西(受维基百科描述的启发)

我的实现可作为 gist 使用

于 2013-10-18T07:49:24.160 回答
1

我目前在 Node 中使用Google 的 libphonenumber的实现,效果很好。我想你可以尝试一个 PHP 实现,例如libphonenumber-for-php

于 2017-06-26T18:46:13.587 回答
0

硬编码的检查可以变成从调用代码列表中自动生成的决策树。树的每个节点都定义了“当前”字符、可能的后续字符列表(树节点)或一个国家(如果它是一个终端节点)。根节点将用于前导“+”号。

于 2010-12-20T23:03:53.597 回答
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;
}
于 2019-03-01T08:07:43.083 回答
-1

您可以轻松地从第一个数字开始进行简单的查找,然后是第二个,依此类推,直到找到它。这将正常工作,因为没有呼叫代码是另一个代码的前缀,即国际呼叫代码形成一个“前缀代码”(电话系统依赖此属性)。

我不擅长 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

本质上,您在前缀和国家/地区之间有一个关联数组(我假设您可以从该 Wikipedia 文章中轻松生成。您尝试在关联数组中查找电话号码的第一个数字。如果它不在数组中,请尝试前两个数字,然后是前三位。如果三位数字后没有匹配项,则此号码不以有效的国际电话代码开头。

于 2010-12-20T23:25:24.553 回答