Написал вчера функцию, просто шоб було. Порой она была мне была нужна, но её не было. Теперь она есть, но пока не нужна. Может быть кому-нибудь пригодится. Если у кого-то есть решение более симпатишное и менее регекспное, то я бы с радостью им вопользовался. Хотя, для числа из 7, 10, 11 или 12 символов регекспность не такая уж и проблема, ящитаю. PHP: <? function phone($number, $format = '[1] [(3)] 3-2-2'){ $plus = ($number[0] == '+'); // есть ли + $number = preg_replace('/\D/', '', $number); // убираем все знаки кроме цифр $len = array_sum(preg_split('/\D/', $format)); // получаем сумму чисел из $format $params = array_reverse(str_split($number)); // разбиваем $number на цифры и переворачиваем массив $params += array_fill(0, $len, 0); // забиваем пустаты предыдущего массива нулями $format = strrev(preg_replace('/(\d)/e', "str_repeat('d%', '\\1')", $format)); // делаем форматированную строку и переворачиваем её $format = call_user_func_array('sprintf', array_merge(array($format), $params)); // заполняем строку цирами $format = ($plus ? '+' : '').strrev($format); // возвращаем строку в нормальное положение и прилепляем + обратно, если он был if (preg_match_all('/\[(.*?)\]/', $format, $match)) // тут чистим от необязательных кусков for ($i = 0, $c = count($match[0]); $i < $c; $i++) if (!(int)preg_replace('/\D/', '', $match[1][$i])) $format = str_replace($match[0][$i], '', $format); return strtr(trim($format), array('[' => '', ']' => '')); // вырезаем знаки необязательности } $format в функции можно указывать как угодно. В квадратных скобках - необязательные параметры, и будут вырезена, если цифр на них не хватит. Если цифр не хватит чему-то не в квадратных скобках, то цифры будут подменены нулями. Обратите внимание: суть функции сформировать номер по заданому параметру, а не проверить его и выкинуть ошибку. Если вы записываете номер телефона в БД, то используйте валидаторы чтобы проверить номер на правильность. Использовать так: PHP: <? echo phone('+7 (812) 123-45-67'); echo '<br />'; echo phone('8 812 1234567'); echo '<br />'; echo phone('812 1234567'); echo '<br />'; echo phone('1234567'); echo '<br />'; echo phone('7'); echo '<br />'; echo phone('8 (812) 123-45-67'); Результат будет такой:
PHP: <? echo phone('65224', '[1] [(3)] [2]1-2-2'); Это для русского города Нью-Васюки, например. Для твоего города $format будет другой хотя бы потому что код Украины 380, т.е. три цифры, а не одна. Если на сайте кто-то захочет вывести одновременно по одному формату и русский и украинский номер, то ничего не выйдет, конечно. Для стран нужна какая-то БД чтобы хранить записи вида страна - формат.