Как определить страну по нормализованному номеру телефона? - PullRequest
3 голосов
/ 21 декабря 2010

У меня есть список международных телефонных номеров и Список телефонных кодов стран .
Я хотел бы определить страну по номерам, но не могу найти быстрый и элегантный способ сделать это.

Есть идеи? Единственное, что я получил, - это жестко запрограммированный чек (например, «посмотрите на первое число, посмотрите на второе число: если это X, то проверьте на третье число. Если второе число - Y, то страна - Foo» и т. Д.). .). Я использую PHP и БД (MySQL) для списков, но я думаю, что любой псевдокод поможет.

Ответы [ 6 ]

4 голосов
/ 19 августа 2016

Кроме того, вы можете использовать такой инструмент, как Twilio Lookup .

Свойство CountryCode всегда возвращается, когда вы делаете запрос API с Lookup.

https://www.twilio.com/docs/api/lookups#lookups-instance-properties

[ Раскрытие информации: я работаю на Twilio ]

1 голос
/ 26 июня 2017

В настоящее время я использую реализацию libphonenumber от Google в Node, которая работает довольно хорошо. Я полагаю, вы можете попробовать реализацию PHP, например, libphonenumber-для-PHP .

1 голос
/ 18 октября 2013

я был после чего-то похожего на это, но я также хотел определить регион / штат - если доступно. в конце я взломал что-то, основываясь на дереве цифр, начинающих цифры (под влиянием описания в wikipedia )

моя реализация доступна в виде сущности .

0 голосов
/ 01 марта 2019

Проблема здесь в том, что в некоторых странах используется один и тот же телефонный код страны. Например. В Канаде и США номера телефонов начинаются с +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;
}
0 голосов
/ 21 декабря 2010

Вы можете легко выполнить простой поиск, начиная с первого числа, затем второго и так далее, пока не найдете его.Это будет работать правильно, потому что никакой код вызова не является префиксом другого кода, т. Е. Международные коды вызова образуют « код префикса » (телефонная система использует это свойство).

I 'я не очень хорошо разбираюсь в 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

По сути, у вас есть ассоциативный массив между префиксами и странами (который, я полагаю, вы легко можете сгенерировать из этой статьи в Википедии. Вы пытаетесь найти первую цифру телефонного номерав ассоциативном массиве. Если его нет в массиве, попробуйте первые две цифры, а затем первые три. Если после трех цифр нет совпадения, то это число не начинается с действительного международного кода вызова.

0 голосов
/ 21 декабря 2010

Жестко запрограммированную проверку можно превратить в дерево решений, автоматически генерируемое из списка кодов вызова. Каждый узел дерева определяет текущий символ, список возможных следующих символов (узлов дерева) или страну, если это конечный узел. Корневой узел будет для начального знака «+».

...