我有一个国际电话号码列表和一个国家电话代码列表。
我想从数字中识别国家,但我找不到一种快速而优雅的方式来做到这一点。
任何想法?我唯一得到的是进行硬编码检查(例如,“查看第一个数字,查看第二个数字:如果是 X,则检查第三个数字。如果第二个数字是 Y,则国家/地区是 Foo”等.)。我正在使用 PHP 和数据库(MySQL)作为列表,但我认为任何伪代码都会有所帮助。
我有一个国际电话号码列表和一个国家电话代码列表。
我想从数字中识别国家,但我找不到一种快速而优雅的方式来做到这一点。
任何想法?我唯一得到的是进行硬编码检查(例如,“查看第一个数字,查看第二个数字:如果是 X,则检查第三个数字。如果第二个数字是 Y,则国家/地区是 Foo”等.)。我正在使用 PHP 和数据库(MySQL)作为列表,但我认为任何伪代码都会有所帮助。
或者,您可以使用Twilio Lookup 之类的工具。
CountryCode
当您使用 Lookup 发出 API 请求时,始终会返回该属性。
https://www.twilio.com/docs/api/lookups#lookups-instance-properties
[披露:我为 Twilio 工作]
我追求与此类似的东西,但我也想确定地区/州 - 如果有的话。最后,我根据数字前导数字树破解了一些东西(受维基百科描述的启发)
我的实现可作为 gist 使用。
我目前在 Node 中使用Google 的 libphonenumber的实现,效果很好。我想你可以尝试一个 PHP 实现,例如libphonenumber-for-php。
硬编码的检查可以变成从调用代码列表中自动生成的决策树。树的每个节点都定义了“当前”字符、可能的后续字符列表(树节点)或一个国家(如果它是一个终端节点)。根节点将用于前导“+”号。
这里的挑战是一些国家共享相同的电话国家代码。例如,加拿大和美国都有以 +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;
}
您可以轻松地从第一个数字开始进行简单的查找,然后是第二个,依此类推,直到找到它。这将正常工作,因为没有呼叫代码是另一个代码的前缀,即国际呼叫代码形成一个“前缀代码”(电话系统依赖此属性)。
我不擅长 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
本质上,您在前缀和国家/地区之间有一个关联数组(我假设您可以从该 Wikipedia 文章中轻松生成。您尝试在关联数组中查找电话号码的第一个数字。如果它不在数组中,请尝试前两个数字,然后是前三位。如果三位数字后没有匹配项,则此号码不以有效的国际电话代码开头。