« Домены TK пригодны только для мусорных сайтов. | Про цифровое телевидение и приставки для его приема. » |
Создание регулярных выражений из диапазонов телефонных номеров
В процессе ковыряния FreeSWITCH'а разумеется возникла задача разруливать направления звонков по дипазонам номеров. Полагаю, оно возникает у большинства настраивающих IP PBX как только доходит до работы с несколькими направлениями. На пример, звонки на разных сотовых операторов через разные GSM-шлюзы. Квест один и тот же - имея план нумерации в виде диапазонов номеров, получить его в виде регулярных выражений для скармливания ATC. Причем не важно, для FreeSWITCH или Asterisk - регулярки нужны (примерно) одинаковые.
Гуглинг первым делом привел на Хабр, где автор поста обозначил проблему, с которой я не сталкивался. Ну просто не было таких диапазонов в интересующих меня направлениях. Проблема, собственно, в том, что диапазон может быть сильно не круглым как по длине, так и по первому/последнему номеру, и одной регуляркой никак не накрываться. У сотовиков это скорее исключения, а вот у фиксированной связи - сплошь и рядом.
В той же статье есть решение и вообще готовый скрипт, правда, под Asterisk. Переделать его под генерацию масок для свича было бы (наверное) плевым делом, но... Глянул я как автор разбивает диапазон на куски пригодные для описания регуляркой и что-то мне поплохело. Нет, оно может написано красиво и правильно, но объем... В общем, скорее из спортивного интереса, решил попробовать написать свой велосипед. И он таки поехал.
Тоже PHP, тоже обрабатывает кривые диапазоны разбивая их на несколько меньших. Только код сильно компактнее. Без претензий на красоту и законченность кода и решения в целом. Это скорее либа по генерации регулярок из диапазона (от, до), а откуда этот диапазон берется и что потом делается с результатом - это уж на вкус и цвет. Пока - bash-скриптом берем план нумерации, потрошим его, диапазон скармливаем PHP, результат форматируем и выплевываем.
Как работает разбивка:
- Смотрим кратность границ диапазона (1, 10, 100, etc.). Верхняя граница для этого увеличивается на единицу.
- Берем границу с меньшей кратностью (или любую, если кратность одинаковая) и округляем до следующего разряда. Нижнюю вверх, верхнюю - вниз. Получаем диапазон от старой границы до новой
- Если при этом не вылезли за оригинальный диапазон, то делаем для нового регулярку, двигаем границу на новое значение, считаем новую кратность. Goto пункт 2.
- Если вылезли, значит оригинальный диапазон накрывается одной регуляркой - делаем ее. Конец
Плюс костыли для диапазонов в один номер (есть такие, да) и начинающихся с нулей. Ну и, собственно, все. Ровные диапазоны, как и положено, накрываются одной регуляркой, кривые - несколькими.
Брать здесь.