Как разбить номер мобильного телефона на код страны, код города и локальный номер? например, +919567123456 после разделения
код страны = 91
код зоны = 9567
местное число = 123456
Как разбить номер мобильного телефона на код страны, код города и локальный номер? например, +919567123456 после разделения
код страны = 91
код зоны = 9567
местное число = 123456
Невозможно разобрать телефонные номера с помощью простого алгоритма, вам нужно использовать таблицы данных, заполненные правилами каждой страны, поскольку каждая страна по-разному отличает их номера телефонов.
Код страны довольно прост, просто используйте данные из Country calls codes в википедии и создайте таблицу всех уникальных коды стран. Каждая страна имеет уникальный префикс, поэтому легко.
Но тогда вам нужно искать правила для каждой страны, которую вы хотите поддерживать, и извлекать код зоны, используя правила для каждой страны.
Не сохраняйте свою собственную таблицу всех этих данных! Используйте "Java International Phone Number Utilities library v3.0", https://github.com/googlei18n/libphonenumber. Это то, что Google использует, и Google поддерживает его для вас!
Как упоминалось разными людьми, вы не можете сделать это с помощью простого сопоставления строк. Длины ни страны, ни кода зоны не установлены.
Сделав это в прошлом, мы сохранили таблицу, похожую по структуре, на следующую: -
+------------+---------+-------+--------------+ |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] и нашли соответствие для Великобритании/Медвей.
Не очень эффективный, но он сработал.
EDIT
Вы также можете попробовать что-то подобное, но вам нужно будет протестировать его с полным набором данных или, возможно, даже разбить его на отдельные страны и код региона, так как это может быть не очень эффективно с выбранной вами БД.
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.
Думаю, вам понадобится что-то вроде диктатора кода страны и региона. потому что стенд из них может иметь другую длину. США +1, Германия +49, даже +6723. То же самое с Areacodes..
Ответ очень сильно зависит от страны. Нет универсального правила, говорящего "это код страны, это код области, это локальный номер". Единственной информацией, которую можно получить повсеместно, является номер страны (и даже это может быть 1-4 цифры в длину); то вам необходимо проконсультироваться с определенным набором правил для стран.
Для примеров (например, "в разных странах есть много разных телефонных номеров, но все они следуют одному и тому же формату" ):
Если вы будете стремиться к точным данным в Великобритании, см. также http://code.google.com/p/ofcom-csverter/ для полного списка кодов Великобритании с исправлениями.
Очень сложная проблема. Сначала вам нужно определить код страны . В зависимости от кода страны остальная часть должна быть разделена на код зоны и локальный номер. Но ни одна из трех частей не имеет фиксированной длины, а не номера отверстия, а также кода области и локальной комбинации деталей.
Пример: 4930123456789
Пример: 493328123456
Пример: 34971123456