Форматирование телефонных номеров

Попытка написать универсальную 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;
}
PHP

Тестирование и результаты

Мобильные и городские:

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');
PHP
+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

Региональные:

echo phone_format('7 4734 12-34-56');
echo phone_format('7 4735 123-456');
PHP
+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');
PHP
+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');
PHP
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;
}
PHP

Результат:

/* Мобильные и городские */
+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
23.04.2020
Предыдущая запись Чекбоксы в виде кнопок
Следующая запись Поиск файлов в PHP

Комментарии

, чтобы добавить комментарий.

Другие публикации

Сборник регулярных выражений с примерами на PHP для проверки данных из полей форм.
3738
+1
Несколько примеров как перевести цвета из HEX в RGB и обратно с помощью PHP.
2527
+1
Несколько примеров как в PHP получить информацию о домене и IP-адресе.
3702
0
Пример, как сформировать товарную накладную с помощью библиотеки PHPExcel. В результате получится файл в формате xlsx...
10138
+2
date($format, $timestamp) – форматирует дату/время по шаблону, где...
11346
0
Несколько вариантов как быстро организовать запись данных в лог-файл.
20466
+2