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

Несколько PHP-функций для форматирования телефонных номеров.

Формат +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

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

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

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
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
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
TEXT
23.04.2020, обновлено 07.09.2022
10205
Предыдущая запись Чекбоксы в виде кнопок

Комментарии 1

Costa Brava Costa Brava
19 сентября 2022 в 16:41
0
Писал этот комментарий в другом посте (про mb_eregi_replace), но здесь вроде в тему. Может, кому-то нужно. Форматирование российских телефонов перед занесением в базу (самый простой способ). Оставляем только цифры. Отсчитываем с конца 10 цифр и ставим +7.
function phone_clear($t){
$t = mb_eregi_replace("[^0-9]", '', $t);
if(strlen($t) > 9){$data = '+7'.substr($t, -10);}else{$data = '';}
return $data;
}

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

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

Проверка данных регулярными выражениями
Сборник регулярных выражений с примерами на PHP для проверки данных из полей форм.
12647
+5
Преобразование цветов в PHP
Несколько примеров как перевести цвета из HEX в RGB и обратно с помощью PHP.
12078
0
Яндекс.Доставка работа с API в PHP
Примеры работы с API Яндекс.Доставки (для заказа перевозки грузов корпоративным клиентам).
2871
+5
Работа с FTP в PHP
Протокол FTP – предназначен для передачи файлов на удаленный хост. В PHP функции для работы с FTP как правило всегда доступны и не требуется установка дополнительного расширения.
10268
+1
Whois, как получить данные IP-адреса и домена в PHP
Несколько примеров как в PHP получить информацию о домене и IP-адресе.
12717
+4
date() – форматирование даты PHP
date($format, $timestamp) – форматирует дату/время по шаблону, где...
34159
+3