根据电话号码确定国家/地区


Determine Country from Telephone Numbers

我已经看到了一些关于SO的问题,类似于我的要求,但似乎没有什么符合要求。

我处于需要处理通话记录并使用电话号码确定国家/地区的位置。拨打的号码可以是任何国家/地区,例如:

44 7899455120 - 英国

34 965791845 - 西班牙

355 788415235 - 阿尔巴尼亚

显然,如果所有呼叫代码都是两位数,世界会很棒,但事实并非如此。目前,我有一个充满国家/地区及其相关代码的数据库,为了匹配,我需要有效地获取数字的第一个数字,即英国示例的4,并对数据库进行查询,例如:

SELECT * from countries WHERE code LIKE '4%'

例如,这可能会给我 20 个结果。所以我再循环一遍,确实说

SELECT * from countries WHERE code LIKE '44%'

这可能会给我一个结果,现在我可以确定它是英国。然而,像阿尔巴尼亚这样的代码是三位数字,需要更多的循环和数据库调用。这似乎非常简陋且效率低下,但我想不出另一种方法来实现这一目标。我意识到对数据库的三次调用可能看起来不多,但如果您有 1000 个电话要处理,它们很快就会加起来。

看下面的问题:

什么正则表达式将匹配有效的国际电话号码?

似乎有一些关于根据国家/地区代码

验证数字的重要信息,但关于从数字确定国家/地区代码的信息却不多。任何关于更清洁方法的建议或建议将不胜感激。


为清楚起见,手机中的空格显示

存在

一个库,它将解析一串数字并将其重新格式化为国际标准(像4402081231234这样的数字为"+44 20 8123 1234")。它还将从号码中返回电话号码区域"GB"或"US"(如果号码中嵌入了国家/地区代码)。

https://github.com/googlei18n/libphonenumber 原始库是Java的,但也有Javascript,Python,Ruby和PHP等版本。

国家/地区代码中没有重叠歧义。含义:国家/地区代码 11 是非法的,因为 1 被分配给北美。同样,20 是埃及,没有其他国家/地区代码以 20 开头。以 21 开头的国家/地区代码都是 3 位数字。

由于没有重叠歧义,因此您可以在一个查询中直接搜索电话号码的国家/地区代码,12125551212如下所示:

select country
     , code
  from countrycodes
 where code in ('121', '12', '1')

同样,没有国家/地区代码 121 或 12,因此唯一匹配的标准是 1。

假设手机总是这样:

$phone = "355 788415235"; // Albania
$parts = explode(" ", $phone);
$code = $parts[0]; // First part separated by space, 355.

然后直接查询。无需正则表达式。

如果不是这种情况,请考虑将国家/地区代码与输入级别的数字分开。

在您的系统上,每个电话号码的国家/地区代码后都有空格,因此您可以使用它来确定国家/地区。

  1. 创建一个包含所有国家/地区代码的表。勒克

    ID | 国家 | 代码

    1 |土耳其 |90

    2 |西班牙 |34

(有一张表给你:http://erikastokes.com/mysql-help/country.sql.txt)

而不是爆炸你的电话号码。分度计是空白" "。

$phoneNumber = "355 788415235";
$countryCode = explode(" ",$phoneNumber); // it divides phone number to two parts.
$countryCode = $countryCode[0]; // it returns 355. We write index 0 because country code is first part.
//Now you can call your country by country code.
$sqlQuery  ="SELECT country FROM yourTableName WHERE code = '$countryCode' ";
...
//it will works like a charm. Because i currently using this.