Форматирование телефонного номера (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 &nbsp;
        "\xe2\x88\x92" => '-',  # UTF-8 &minus;
        "\xe2\x80\x93" => '-',  # UTF-8 &ndash;
        "\xe2\x80\x94" => '-',  # UTF-8 &mdash;
    );

    #коды номеров городских телефонов России
    #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;
}

?>