Форматирование телефонного номера (1С)
На php
Источник:
<?php
/**
* Проверка корректности телефонного номера (с кодом города) в начале строки.
* Пример строки с корректным тел. номером: "8-495-1234567, 111-22-33 (*620)".
*
* Функция умеет форматировать тел. номер в международный формат.
* Пример строки с форматированным тел. номером : "+7 (495) 123-45-67, 111-22-33 (*620)".
*
* @param string $s тел. номер
* @param array &$parsed массив частей тел. номера с ключами:
* zone -- зона, например: +7
* code -- код города, например: 495 (целое число типа int)
* number -- номер, например: 1234567 (целое число типа int)
* main -- тел. номер в международном формате
* extra -- остаток после тел. номера
* all -- тел. номер в международном формате + остаток
* @param string $hyphen дефис для форматироания тел. номера в международном формате
* @param string $space пробел для форматироания тел. номера в международном формате
* @return bool возвращает TRUE, если тел. номер корректный и FALSE в противном случае.
*
* @link http://ru.wikipedia.org/wiki/Телефонный_код_страны
*
* @license http://creativecommons.org/licenses/by-nc-sa/3.0/
* @author Nasibullin Rinat <n a s i b u l l i n at starlink ru>
* @charset ANSI
* @version 3.1.0
*/
function phone_number_check($s, &$parsed = null, $hyphen = "\xe2\x80\x93", $space = "\xc2\xa0")
{
static $trans = array(
#DEPRECATED:
#'-' => ' ',
#'(' => ' ',
#')' => ' ',
"\t" => ' ', # [TAB]
"\xc2\xa0" => ' ', # UTF-8
"\xe2\x88\x92" => '-', # UTF-8 −
"\xe2\x80\x93" => '-', # UTF-8 –
"\xe2\x80\x94" => '-', # UTF-8 —
);
#коды номеров городских телефонов России
#TODO дополнить список с крупными городами России
static $city_codes = array(
495 => '', #Москва
499 => '', #Москва
496 => '', #Московская область
812 => '', #Санкт-Петербург
);
/*
Примеры правильных тел. номеров:
#3 #4 #5 #6
(812) 571-84-78
(4922) 33-64-32
(41322) 977-17
*/
$s = trim(preg_replace('/\x20\x20+/s', ' ', strtr($s, $trans))); #вырезаем лишние пробелы
if (! preg_match('/^ (?!-)
(?P<zone>\+\d|8)? #1 зона или код выхода на межгород (необязательно)
(?:\x20?\(|(-|^)) #2
(?P<code>\d{3,5}) #3 код города или региона для мобильного номера
(?(2)-|\)\x20?) #условные подмаски
(\d{2,3}) #4 первая группа
-?
(\d{2}) #5 вторая группа
( #6
-?
(\d{2}) #7 третья группа (необязательно)
)?
(?!\d)
(.*) #8
$/sx', $s, $m)) return false;
$zone = ($m['zone'] === '' || $m['zone'] === '8' ? '+7' : $m['zone']);
$code = $m['code'];
$number = $m[4] . $m[5] . @$m[7];
if (strlen($code . $number) !== 10) return false; #всего д.б. 10 цифр!
/*
Номер __городского__ телефона НЕ может начинаться с нуля или восьмёрки (мобильный может)
0 зарезервирован за спецслужбами (01, 02, 03, 04, 09)
8 зарезервирован за кодом междугородного вызова
*/
if (array_key_exists($code, $city_codes) && preg_match('/^[08]/s', $number)) return false;
#защита "от дурака" для номеров типа 222-22-22
if (preg_match('/^(\d)\\1{6,}/s', $number)) return false;
#форматируем тел. номер в международный формат
$main = str_replace('-', $hyphen, $zone . $space . '(' . $code . ')' . $space . $m[4] . '-' . $m[5] . (array_key_exists(7, $m) ? '-' . $m[7] : '') );
$parsed = array(
'zone' => $zone,
'code' => intval($code),
'number' => intval($number),
'main' => $main,
'extra' => $m[8],
'all' => $main . $m[8],
);
#d($parsed);
return true;
}
?>