Форматирование телефонного номера (1С)
Материал из КинтВики
На php
Источник:
<source lang=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\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;
}
?>
</source>