【问题标题】:How to identify a country from a normalized phone number?如何从规范化的电话号码中识别一个国家?
【发布时间】:2011-05-28 13:06:20
【问题描述】:

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

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

【问题讨论】:

  • 不,这几乎就是这样做的方式。提出一种文件格式,以便更轻松地更新该列表。
  • 电话号码是怎么给你的?您知道呼叫代码还是它们都只是一个号码的一部分?
  • mm 为什么不直接查询前缀呢?
  • @birryree:我在 MySQL 中有一个表,每一行都是一个规范化的数字。你为什么问这个? @Eric:你是什么意思?你能说得清楚一点吗?
  • @Paolo - 如果您将国家/地区代码与电话号码分开,那么查找会容易得多(当然,如果您有的话,您也可以在表格中设置一个字段来自国家代码的原产国)。

标签: phone-number country-codes


【解决方案1】:

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

【讨论】:

  • @downvoter 被要求评论他们认为我的回答有什么问题。 OP 的问题通常使用我在回答中描述的prefix tree 来解决。
【解决方案2】:

您可以轻松地进行简单的查找,从第一个数字开始,然后是第二个,依此类推,直到找到为止。这将正常工作,因为没有呼叫代码是另一个代码的前缀,即国际呼叫代码形成“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

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

【讨论】:

  • 没那么简单。大多数北美国家共享国家代码 1(美国、加拿大、巴哈马等)。俄罗斯和哈萨克斯坦也都使用 7。您应该使用更复杂的工具。我用 ruby​​ 写了一个可能很容易移植到 PHP 中的代码:* github.com/bowsersenior/itu_codes
【解决方案3】:

我正在寻找与此类似的东西,但我也想确定地区/州 - 如果有的话。最后,我根据数字前导数字树破解了一些东西(受到wikipedia 的描述的刺激)

我的实现是available as a gist

【讨论】:

    【解决方案4】:

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

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

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

    [披露:我为 Twilio 工作]

    【讨论】:

    • 您可以通过将这些标记为重复关闭来为社区做出贡献...
    • 加一个用于披露
    【解决方案5】:

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

    【讨论】:

    • 您需要指定国家以检查该国家的有效电话号码。
    • @gdfgdfg 如果您查看 GitHub 页面中的地理编码器示例,它看起来可以从电话号码中推导出城市(希望还有国家)。
    【解决方案6】:

    这里的挑战是某些国家/地区共享相同的电话国家/地区代码。例如。加拿大和美国都有以 +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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-22
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 2013-11-02
      相关资源
      最近更新 更多