Попытка написать универсальную PHP-функцию для форматирования телефонных номеров в вид +7 (xxx) xxx-xx-xx, а также с четырёх значным кодом +7 (xxxx) xxx-xxx, но без проверки кодов городов т.к. нумерация со временем меняется.
function phone_format($phone)
{
$phone = trim($phone);
$res = preg_replace(
array(
'/[\+]?([7|8])[-|\s]?\([-|\s]?(\d{3})[-|\s]?\)[-|\s]?(\d{3})[-|\s]?(\d{2})[-|\s]?(\d{2})/',
'/[\+]?([7|8])[-|\s]?(\d{3})[-|\s]?(\d{3})[-|\s]?(\d{2})[-|\s]?(\d{2})/',
'/[\+]?([7|8])[-|\s]?\([-|\s]?(\d{4})[-|\s]?\)[-|\s]?(\d{2})[-|\s]?(\d{2})[-|\s]?(\d{2})/',
'/[\+]?([7|8])[-|\s]?(\d{4})[-|\s]?(\d{2})[-|\s]?(\d{2})[-|\s]?(\d{2})/',
'/[\+]?([7|8])[-|\s]?\([-|\s]?(\d{4})[-|\s]?\)[-|\s]?(\d{3})[-|\s]?(\d{3})/',
'/[\+]?([7|8])[-|\s]?(\d{4})[-|\s]?(\d{3})[-|\s]?(\d{3})/',
),
array(
'+7 ($2) $3-$4-$5',
'+7 ($2) $3-$4-$5',
'+7 ($2) $3-$4-$5',
'+7 ($2) $3-$4-$5',
'+7 ($2) $3-$4',
'+7 ($2) $3-$4',
),
$phone
);
return $res;
}
Тестирование и результаты
Мобильные и городские:
echo phone_format('+7 (495) 1234567');
echo phone_format('+8 (495) 123 45 67');
echo phone_format('+7(495)123-45-67');
echo phone_format('+7(495)1234567');
echo phone_format('+7 495 123-45-67');
echo phone_format('+8 495 123 45 67');
echo phone_format('+7 495 1234567');
echo phone_format('+7-495-123-45-67');
echo phone_format('84951234567');
+7 (495) 123-45-67
+7 (495) 123-45-67
+7 (495) 123-45-67
+7 (495) 123-45-67
+7 (495) 123-45-67
+7 (495) 123-45-67
+7 (495) 123-45-67
+7 (495) 123-45-67
+7 (495) 123-45-67
Региональные:
+7 (4734) 12-34-56
+7 (4735) 123-456
С текстом:
echo phone_format('+7-495-123-45-67 Иван');
echo phone_format('+84951234567 доп. 123');
echo phone_format('+74951234567, +79031234567');
echo phone_format('тел. +84951234567');
+7 (495) 123-45-67 Иван
+7 (495) 123-45-67 доп. 123
+7 (495) 123-45-67, +7 (903) 123-45-67
тел. +7 (495) 123-45-67
Номера с ошибками:
echo phone_format('495 1234567');
echo phone_format('8(8001234567');
echo phone_format('8800;1234567');
495 1234567
8(8001234567
8800;1234567
О формате
Формат +7 (xxx) xxx-xx-xx
очень распространён, но правильнее писать номера без скобок. В нормах русского языка скобки используются для поясняющей и дополняющей информации, а так как без кода оператора или города дозвониться до абонента не получится, то это уже не дополнительная информация.
Вторая версия функции:
function phone_format($phone)
{
$phone = trim($phone);
$res = preg_replace(
array(
'/[\+]?([7|8])[-|\s]?\([-|\s]?(\d{3})[-|\s]?\)[-|\s]?(\d{3})[-|\s]?(\d{2})[-|\s]?(\d{2})/',
'/[\+]?([7|8])[-|\s]?(\d{3})[-|\s]?(\d{3})[-|\s]?(\d{2})[-|\s]?(\d{2})/',
'/[\+]?([7|8])[-|\s]?\([-|\s]?(\d{4})[-|\s]?\)[-|\s]?(\d{2})[-|\s]?(\d{2})[-|\s]?(\d{2})/',
'/[\+]?([7|8])[-|\s]?(\d{4})[-|\s]?(\d{2})[-|\s]?(\d{2})[-|\s]?(\d{2})/',
'/[\+]?([7|8])[-|\s]?\([-|\s]?(\d{4})[-|\s]?\)[-|\s]?(\d{3})[-|\s]?(\d{3})/',
'/[\+]?([7|8])[-|\s]?(\d{4})[-|\s]?(\d{3})[-|\s]?(\d{3})/',
),
array(
'+7 $2 $3-$4-$5',
'+7 $2 $3-$4-$5',
'+7 $2 $3-$4-$5',
'+7 $2 $3-$4-$5',
'+7 $2 $3-$4',
'+7 $2 $3-$4',
),
$phone
);
return $res;
}
Результат:
/* Мобильные и городские */
+7 495 123-45-67
+7 495 123-45-67
+7 495 123-45-67
+7 495 123-45-67
+7 495 123-45-67
+7 495 123-45-67
+7 495 123-45-67
+7 495 123-45-67
+7 495 123-45-67
/* Региональные */
+7 4734 12-34-56
+7 4735 123-456
/* С текстом */
+7 495 123-45-67 Иван
+7 495 123-45-67 доп. 123
+7 495 123-45-67, +7 903 123-45-67
тел. +7 495 123-45-67
/* Номера с ошибками */
495 1234567
8(8001234567
8800;1234567