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

3
我有一份国际电话号码列表和一个国家电话区号列表
我想要通过这些号码识别出它们所属的国家,但我没有找到一个快速优雅的方法来做到这一点。
你有什么想法吗?我目前唯一的想法是硬编码的检查(例如,“查看第一个数字,查看第二个数字:如果是X,则检查第三个数字。如果第二个数字是Y,则该国家为Foo”等)。 我正在使用PHP和DB(MySQL)进行列表处理,但我认为任何伪代码都会有帮助。

不,那基本上就是做法。想出一个文件格式,使更新列表更容易。 - Robert
你们收到的电话号码是怎样的呢?你们知道区号还是所有号码都是一个整体? - wkl
为什么不直接查询前缀呢? - Eric Fortis
@birryree:我在MySQL中有一张表,每行都是一个标准化的数字。你为什么问这个问题? @Eric:你是什么意思?能否请你更清楚地说明一下? - Paolo
@Paolo - 如果你将国家代码与电话号码分开,那么查找将会更容易(当然,如果你有这个,你也可以在表中添加一个字段来表示来源国家,该字段由国家代码派生)。 - wkl
@Paolo 我会通过创建一个包含两列的表来解决这个问题,一列是前缀,另一列是国家。然后提取前缀并查询数据库以获取国家信息。 - Eric Fortis
6个回答

7

2
你可以通过标记这些重复项进行关闭来为社区做出贡献... - miken32
加一披露 - eddyP23
我正在使用Twilio版本3.4.1.0,对于我的应用程序来说,暂时无法更新此库。有没有办法在该版本中获取这些信息?谢谢。 - CABascourt
我是指Twilio客户端。 - CABascourt

2

我需要类似于这样的东西,但是我还想确定该地区/州是否可用。最终,我基于数字领先数字的树(在维基百科的描述下)创造了一些东西。

我的实现可以在此处获取


1

您需要指定国家以检查该国家的电话号码是否有效。 - gdfgdfg
如果您查看GitHub页面中的Geocoder示例,它似乎可以从电话号码中推导出城市(并希望也能推导出国家)。 - finferflu

0

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


请@downvoter在评论中指出我回答的问题。根据我的描述,OP的问题通常可以使用前缀树来解决。前缀树是一种有效的数据结构。 - Ondrej Tucny

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;
}

-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

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


2
这并不是那么简单。 大多数北美国家共享1的国家代码(美国,加拿大,巴哈马等)。 俄罗斯和哈萨克斯坦也都使用7。 您应该使用更复杂的工具。 我用Ruby编写了一个可能很容易转换到PHP的工具:
  • https://github.com/bowsersenior/itu_codes
- bowsersenior

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接