За последние 24 часа нас посетили 22048 программистов и 1654 робота. Сейчас ищут 1316 программистов ...

Формируем телефонный номер из заданого числа

Тема в разделе "Решения, алгоритмы", создана пользователем lexa, 15 июн 2009.

  1. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Написал вчера функцию, просто шоб було. Порой она была мне была нужна, но её не было. Теперь она есть, но пока не нужна. :) Может быть кому-нибудь пригодится. Если у кого-то есть решение более симпатишное и менее регекспное, то я бы с радостью им вопользовался. Хотя, для числа из 7, 10, 11 или 12 символов регекспность не такая уж и проблема, ящитаю.

    PHP:
    1. <?
    2. function phone($number, $format = '[1] [(3)] 3-2-2'){
    3.     $plus = ($number[0] == '+'); // есть ли +
    4.     $number = preg_replace('/\D/', '', $number); // убираем все знаки кроме цифр
    5.  
    6.     $len = array_sum(preg_split('/\D/', $format)); // получаем сумму чисел из $format
    7.     $params = array_reverse(str_split($number)); // разбиваем $number на цифры и переворачиваем массив
    8.     $params += array_fill(0, $len, 0); // забиваем пустаты предыдущего массива нулями
    9.  
    10.     $format = strrev(preg_replace('/(\d)/e', "str_repeat('d%', '\\1')", $format)); // делаем форматированную строку и переворачиваем её
    11.     $format = call_user_func_array('sprintf', array_merge(array($format), $params)); // заполняем строку цирами
    12.     $format = ($plus ? '+' : '').strrev($format); // возвращаем строку в нормальное положение и прилепляем + обратно, если он был
    13.  
    14.     if (preg_match_all('/\[(.*?)\]/', $format, $match)) // тут чистим от необязательных кусков
    15.         for ($i = 0, $c = count($match[0]); $i < $c; $i++)
    16.             if (!(int)preg_replace('/\D/', '', $match[1][$i]))
    17.                 $format = str_replace($match[0][$i], '', $format);
    18.  
    19.     return strtr(trim($format), array('[' => '', ']' => '')); // вырезаем знаки необязательности
    20. }
    $format в функции можно указывать как угодно. В квадратных скобках - необязательные параметры, и будут вырезена, если цифр на них не хватит. Если цифр не хватит чему-то не в квадратных скобках, то цифры будут подменены нулями.

    Обратите внимание: суть функции сформировать номер по заданому параметру, а не проверить его и выкинуть ошибку. Если вы записываете номер телефона в БД, то используйте валидаторы чтобы проверить номер на правильность.

    Использовать так:
    PHP:
    1. <?
    2. echo phone('+7 (812) 123-45-67');
    3. echo '<br />';
    4. echo phone('8 812 1234567');
    5. echo '<br />';
    6. echo phone('812 1234567');
    7. echo '<br />';
    8. echo phone('1234567');
    9. echo '<br />';
    10. echo phone('7');
    11. echo '<br />';
    12. echo phone('8 (812) 123-45-67');
    Результат будет такой:
     
  2. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    а как же на счет, например, моего городского номера в городе Белая Церковь, Украина?
    6-52-24
     
  3. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    PHP:
    1. <?
    2. echo phone('65224', '[1] [(3)] [2]1-2-2');
    Это для русского города Нью-Васюки, например. :) Для твоего города $format будет другой хотя бы потому что код Украины 380, т.е. три цифры, а не одна.

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