Форматирование телефонного номера (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>