Как разделить номер мобильного телефона на код страны, код области и локальное число?

Как разделить номер мобильного телефона на код страны, код области и локальное число? например, +919567123456, после того, как разделено

код страны = 91

код области = 9567

локальное число = 123456

18
задан Arne Burmeister 30 March 2010 в 10:06
поделиться

6 ответов

Невозможно проанализировать телефонные номера с помощью простого алгоритма, вам нужно использовать таблицы данных, заполненные правилами каждой страны, потому что каждая страна разграничивает свои телефонные номера по-разному.

Код страны довольно прост, просто используйте данные из статьи Телефонные коды стран в Википедии и создайте таблицу всех уникальных кодов стран. У каждой страны есть уникальный префикс, так что это легко.

Но тогда вам нужно найти правила для каждой страны, которую вы хотите поддерживать, и извлечь код (а) города, используя правила для каждой страны.

23
ответ дан 30 November 2019 в 05:41
поделиться

Как упоминалось разными людьми, вы не можете сделать это с помощью простой строки соответствие. Длины кодов страны и города не фиксированы.

Сделав это в прошлом, мы поддерживали таблицу, аналогичную по структуре следующей: -

+------------+---------+-------+--------------+
|country_code|area_code|country|area          |
+------------+---------+-------+--------------+
|44          |1634     |UK     |Medway        |
|44          |20       |UK     |London        |
|964         |23       |Iraq   |Wasit (Al Kut)|
|964         |2412     |Iraq   |Unreal        |
+------------+---------+-------+--------------+

Затем мы вычислили максимальную длину area_code и country_code и проверили строку путем подстроки, начиная с максимальной длины и работая с нашим путь вниз, пока мы не нашли совпадение.

Таким образом, учитывая число 441634666788

, мы начали бы с подстроки [1,7] (7 - длина самой длинной комбинации кода страны / города), не нашли совпадения, а затем перешли бы к [1, 6] и нашел совпадение для UK / Medway.

Не очень эффективно, но сработало.

РЕДАКТИРОВАТЬ

Вы также можете попробовать что-то подобное, но вам нужно будет протестировать его с полным набором данных или, возможно, даже разбить его на отдельные страны и коды регионов, так как это может быть не очень эффективно с выбранной вами БД. .

 DECLARE @area_codes TABLE
(
    country_code VARCHAR(10),
    area_code VARCHAR(10),
    country VARCHAR(20),
    area VARCHAR(20),
    match_string VARCHAR(MAX),
    match_length INTEGER
)

INSERT INTO @area_codes VALUES ('44','1382','UK','Dundee', '441382%', 6)
INSERT INTO @area_codes VALUES ('44','1386','UK','Evesham', '441386%', 6)
INSERT INTO @area_codes VALUES ('44', '1', 'UK', 'Geographic numbers', '441%', 3)

DECLARE @number VARCHAR(MAX)
SET @number = '441386111111'

SELECT TOP 1 * 
FROM @area_codes 
WHERE @number LIKE match_string
ORDER BY match_length DESC

Вы должны поддерживать поля match_string и match_length с помощью триггера, заботясь о том, чтобы справиться с нулевыми кодами областей и проиндексировать таблицу по столбцу match_string.

4
ответ дан 30 November 2019 в 05:41
поделиться

Ответ во многом зависит от страны. Не существует универсального правила, говорящего «это код страны, это код города, это местный номер».Единственная информация, которую можно получить повсеместно, - это номер страны (и даже он может состоять из 1-4 цифр); тогда вам нужно проконсультироваться с правилами конкретной страны.

Для примеров (например, «в данных странах много разных телефонных номеров, но все они имеют один и тот же формат »):

  • +420123456789 - это ( фиктивный) номер в Чехии (код страны +420), а остальное - местный номер (в некоторых странах используется неразделенное адресное пространство, хотя вы можете вывести несколько битов данных из первых 1-4 цифр местного номера ( например, «+420800 - бесплатные номера»)). Таким образом, единственный полезный способ разбить это число на две части: +420 123456789 .
  • +18005551234 - номер (вероятно, тоже фиктивный) в США; согласно Североамериканскому плану нумерации , +1 - это код страны, 800 - код города (бесплатные номера), 555 - код станции и 1234 - местный номер. Затем вы можете разобрать номер на четыре части: +1 800 555 1234 .
3
ответ дан 30 November 2019 в 05:41
поделиться

Я думаю, вам понадобится что-то вроде диктонария кодов стран и городов. потому что у каждого из них может быть разная длина. США +1, Германия +49, даже +6723. То же самое с ареакодами...

3
ответ дан 30 November 2019 в 05:41
поделиться

Очень сложная проблема. Сначала нужно определить код страны. В зависимости от кода страны, остальную часть нужно разделить на код города и местный номер. Но ни одна из трех частей не имеет фиксированной длины, ни номер ямы, ни комбинация кода города и местной части!

Пример: 4930123456789

  • 49 - код страны Германии
  • 30 - код города Берлина
  • 123456789 - местный номер в Берлине (не настоящий)

Пример: 493328123456

  • 49 - код страны Германии
  • 3328 - код города Тельтов
  • 123456 - местный номер в Тельтове (не существует)

Пример: 34971123456

  • 34 - код страны Испании
  • 971 - код города Майорка
  • 123456 - местный номер на Майорке (не настоящий)
0
ответ дан 30 November 2019 в 05:41
поделиться

Не ведите собственную таблицу всех этих данных! Используйте библиотеку Java International Phone Number Utilities v3.0, https://github.com/googlei18n/libphonenumber . Это то, что использует Google, и Google поддерживает это для вас!

50
ответ дан 30 November 2019 в 05:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: