2015-01-14 5 views
2

Я видел несколько вопросов о 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

Это может быть невозможно без конкретной точки совпадения. В мире всего 196 стран, а не большое дело ... – vamsi

+0

Вам следует рассмотреть возможность запуска более общего поиска с услугами, предлагаемыми сторонней стороной, или поисковой таблицей, содержащей CC + Length, для «лучшего предположения». Вы можете найти спецификации @ ITU (рекомендуем http://www.itu.int/rec/T-REC-E.164-201011-I/en). Также см., Например, как Ямайка отличается от США (http: // www.wtng.info/wtng-1876-jm.html), или как Израиль/Палестина или Сателитные службы используют «префикс» (CC) –

+0

Можете ли вы указать, что такое параметр поиска? Я имею в виду, вход, который вы отправляете в MySQL для получения данных, потому что в зависимости от этого мы можем дать вам лучший ответ. –

ответ

4

Существует библиотека, которая будет анализировать строку цифр и переформатировать ее в соответствии с международными стандартами (число от 4402081231234 до «+44 20 8123 1234»). Он также вернет регион номер телефона, «GB» или «США» из числа, если в номере указан код страны.

https://github.com/googlei18n/libphonenumber Исходная библиотека находится на Java, но есть и версии в Javascript, Python, Ruby и PHP и другие.

+0

Никогда не принимал этот ответ, но я все время использую эту библиотеку. –

+1

@ TheHumbleRat Я пытаюсь понять, как это решило вашу проблему. Читая документы, они выглядят так, как будто вам нужно указать 'number' ** и **' country', чтобы создать номер прото-объекта. Верный? Я что-то упустил? –

+1

@StevenM Мне было интересно то же самое. Код страны, который был принят, является кодом страны по умолчанию, который используется, только если предоставленный номер не может использоваться для определения кода страны. Образец №. не может быть проанализирована библиотекой. Если вы не префикс '+'. – andho

0

Предполагая, что телефон всегда будет выглядеть:

$phone = "355 788415235"; // Albania 
$parts = explode(" ", $phone); 
$code = $parts[0]; // First part separated by space, 355. 

Затем запрос с тем, что непосредственно. Не требуется регулярного выражения.

Если это не так, подумайте о том, чтобы отделить код страны от номера на входном уровне.

+0

Пожалуйста, см. Мое обновление - места для ясности. –

+0

@ TheHumbleRat Тогда это невозможно. Потому что «12 34567» и «1 234567» являются действительными числами. Без пробелов два разных числа становятся одинаковыми. Отделите два на входном уровне. –

+1

Нет, эти два числа недействительны. В стандарте нет двусмысленности. См. Http://en.m.wikipedia.org/wiki/List_of_country_calling_codes – longneck

1

В вашей системе каждый номер телефона имеет пробел после кода страны, поэтому вы можете использовать его для определения страны.

  1. Создать таблицу со всеми национальными кодами.Lıke

    ID | страна | Код

    1 | Турция | 90

    2 | Испания | 34

(Существует таблица для вас: http://erikastokes.com/mysql-help/country.sql.txt)

Чем взорвать ваш номер телефона. Делиметр - это пробел "".

$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. 
+0

Ссылка сейчас 404. –

2

В кодах стран нет двусмысленности наложения. Значение: код страны 11 является незаконным, поскольку 1 присваивается Северной Америке. Аналогичным образом, 20 - это Египет, и нет других кодов стран, начинающихся с 20. И коды стран, начинающиеся с 21, - все 3 цифры.

Поскольку не перекрываются неоднозначность, вы можете непосредственно искать код страны в одном запросе на номер телефона 12125551212, как это:

select country 
    , code 
    from countrycodes 
where code in ('121', '12', '1') 

Опять же, нет коды стран 121 или 12, таким образом, только критерии, которые будут соответствовать, равны 1.

Смежные вопросы