Исходя из опыта написания подобных вещей, действительно сложно добиться 100% надежности. Для этого я написал некоторый Java-код, который достаточно хорош для обработки имеющихся у нас данных, но не будет применим в каждой стране. Вопросы, которые вам нужно задать:
Согласны ли сопоставления символов и чисел между странами? США часто используют это (например, 1800-GOT-MILK), но в Австралии, например, это довольно редко. Что вам нужно сделать, это убедиться, что вы делали правильное сопоставление для рассматриваемой страны, если она меняется (возможно, нет). Я не знаю, что делают страны, использующие разные алфавиты (например, кириллица в России и странах бывшего восточного блока);
Вы должны признать, что ваше решение не будет 100%, и вы не должны ожидать, что оно будет. Вы должны принять подход «лучшего предположения». Например, нет реального способа узнать, что 132345 является действительным номером телефона в Австралии, как и 1300 123 456, но это только два шаблона для номеров 13xx, и их нельзя вызывать из-за рубежа;
Вы также должны спросить, хотите ли вы проверить регионы (коды городов). Я полагаю, что в США используется система, в которой вторая цифра кода города равна 1 или 0. Это, возможно, когда-то имело место, но я не уверен, применимо ли оно до сих пор. Как бы то ни было, у многих других стран будут другие правила. В Австралии действительные коды города для стационарных и мобильных (сотовых) телефонов состоят из двух цифр (первая - 0). 08, 03 и 04 все действительны. 01 нет. Как вы обслуживаете это? Вы хотите?
Страны используют разные соглашения, независимо от того, сколько цифр они пишут. Вы должны решить, хотите ли вы принять что-то кроме «нормы». Все это распространено в Австралии:
- (02) 1234 5678
- 02 1234 5678
- 0411 123 123 (но я никогда не видел 04 1112 3456)
- 131 123
- 13 1123
- 131 123
- 1 300 123 123
- 1300 123 123
- 02-1234-5678
- 1300-234-234
- + 44 78 1234 1234
- + 44 (0) 78 1234 1234
- + 44-78-1234-1234
- 0011 44 78 1234 1234 (0011 - это стандартный международный телефонный код)
- (44) 078 1234 1234 (не часто)
И это только с моей головы. Для одной страны. Во Франции, например, обычно пишут номер телефона в парах номеров (12 34 56 78), и они тоже произносят его так: вместо:
un (one), deux (two), trois (three), ...
его
douze (двенадцать), trente-quatre (тридцать четыре), ...
Хотите ли вы удовлетворить этот уровень культурных различий? Я бы предположил, что нет, но вопрос стоит рассмотреть на тот случай, если вы сделаете свои правила слишком строгими.
Также некоторые люди могут добавлять добавочные номера к телефонным номерам, возможно, с «ext» или подобным сокращением. Вы хотите обслужить это?
Извините, здесь нет кода. Просто список вопросов, чтобы задать себе и вопросы для рассмотрения. Как уже говорили другие, ряд регулярных выражений может выполнять большую часть вышеперечисленного, но в конечном итоге поля телефонных номеров (в основном) представляют собой текст произвольной формы в конце дня.