从电话号码确定国家

时间:2015-01-14 08:44:22

标签: php regex preg-match

我在SO上看到了一些与我的要求类似的问题,但似乎没有什么能符合这个要求。

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

44 7899455120 - 英国

34 965791845 - 西班牙

355 788415235 - 阿尔巴尼亚

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

SELECT * from countries WHERE code LIKE '4%'

这可能会给我20个结果。所以我再次循环,然后说

SELECT * from countries WHERE code LIKE '44%'

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

查看以下问题:

What regular expression will match valid international phone numbers?

似乎有一些很好的信息可以根据国家/地区代码验证数字,但不是根据数字确定国家/地区代码。任何有关清洁方法的建议或建议都将不胜感激。


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

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:1)

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

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

    id |国家|代码

    1 |土耳其| 90

    2 |西班牙| 34

  2. (有一张桌子给你:http://erikastokes.com/mysql-help/country.sql.txt

    比爆炸你的电话号码。 Delimeter是白色空间“”。

    $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.
    

答案 3 :(得分:0)

假设手机总是这样:

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

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

如果情况并非如此,请考虑将国家/地区代码与输入级别的数字分开。