我在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?
似乎有一些很好的信息可以根据国家/地区代码验证数字,但不是根据数字确定国家/地区代码。任何有关清洁方法的建议或建议都将不胜感激。
为清晰起见,手机中的空格显示
答案 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)
在您的系统上,每个电话号码在国家/地区代码后都有空格,因此您可以使用它来确定国家/地区。
创建一个包含所有国家/地区代码的表格。像
id |国家|代码强>
1 |土耳其| 90
2 |西班牙| 34
(有一张桌子给你: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.
然后直接查询。不需要正则表达式。
如果情况并非如此,请考虑将国家/地区代码与输入级别的数字分开。