Nano Hash - криптовалюты, майнинг, программирование

Маска телефона Javascript для текстового поля с регулярным выражением

Я использую эту функцию для маскировки телефона и работает почти идеально.

function mask(o, f) 
{ 
    v_obj = o; 
    v_fun = f; 
    setTimeout("execmask()", 1) 
};

function execmask() 
{ 
    v_obj.value = v_fun(v_obj.value) 
};

function mphone(v){
    v=v.replace(/\D/g,"");           
    v=v.substring(0, 11);
    v=v.replace(/^(\d{2})(\d)/g,"(OXX$1) $2"); 
    v=v.replace(/(\d)(\d{4})$/,"$1-$2"); 
    return v;
}

Здесь я запускаю маску в текстовом поле:

<input type="text" id="phone" name="phone" onkeypress="mask(this, mphone);" onblur="mask(this, mphone);" />

Проблема в том, что мне нужно изменить эту часть кода (OXX$1) на (0XX$1).

Текущая ситуация с 9 цифрами: (OXX99) 99999-9999.

Текущая ситуация с 8 цифрами: (OXX99) 9999-9999.

Правильное форматирование, которое мне нужно с 9 цифрами: (0XX99) 99999-9999

Правильное форматирование, которое мне нужно с 8 цифрами: (0XX99) 99999-9999

Количество цифр 8 или 9 по выбору пользователя.

Если я меняю символ «О» на «0», возникает ошибка в маске.

Пожалуйста помоги!



Ответы:


1
function mask(o, f) {
    setTimeout(function () {
        var v = f(o.value);
        if (v != o.value) {
            o.value = v;
        }
    }, 1);
}

function mphone(v) {
    var r = v.replace(/\D/g,"");
    r = r.replace(/^0/,"");
    if (r.length > 10) {
        // 11+ digits. Format as 5+4.
        r = r.replace(/^(\d\d)(\d{5})(\d{4}).*/,"(0XX$1) $2-$3");
    }
    else if (r.length > 5) {
        // 6..10 digits. Format as 4+4
        r = r.replace(/^(\d\d)(\d{4})(\d{0,4}).*/,"(0XX$1) $2-$3");
    }
    else if (r.length > 2) {
        // 3..5 digits. Add (0XX..)
        r = r.replace(/^(\d\d)(\d{0,5})/,"(0XX$1) $2");
    }
    else {
        // 0..2 digits. Just add (0XX
        r = r.replace(/^(\d*)/, "(0XX$1");
    }
    return r;
}

http://jsfiddle.net/BBeWN/

04.04.2013
  • Хорошо, отлично. Благодарю вас! Но забыл уточнить: Если в телефоне 8 цифр, то форматирование должно быть таким: (0XX99) 9999-9999 Если в телефоне 9 цифр, то выглядит так: (0XX99) 99999-9999 Сумма 8 или 9 цифр - выбор пользователя. Что мне изменить в этой функции? Благодарный 04.04.2013
  • Я предлагаю начать использовать маску только после первого символа, так как мы можем очистить все значение. Я также предлагаю добавлять - только тогда, когда r.length > 6, поэтому удаление char за char (backspace) сохранит эту функцию. 07.07.2017

  • 2

    Мне нравится эта функция, и я использую ее все время. Я добавил 2 другие маски, если они кому-то нужны. Я понимаю, что они не отвечают прямо на вопрос, но они очень полезны.

    //Social Security Number for USA
     function mssn(v) {
        var r = v.replace(/\D/g,"");
        r = r.replace(/^0/,"");
        if (r.length > 9) {
            r = r.replace(/^(\d\d\d)(\d{2})(\d{0,4}).*/,"$1-$2-$3");
            return r;
        }
        else if (r.length > 4) {
            r = r.replace(/^(\d\d\d)(\d{2})(\d{0,4}).*/,"$1-$2-$3");
        }
        else if (r.length > 2) {
            r = r.replace(/^(\d\d\d)(\d{0,3})/,"$1-$2");
        }
        else {
            r = r.replace(/^(\d*)/, "$1");
        }
        return r;
    }
    
    //USA date
    function mdate(v) {
       var r = v.replace(/\D/g,"");
       if (r.length > 4) {
        r = r.replace(/^(\d\d)(\d{2})(\d{0,4}).*/,"$1/$2/$3");
       }
       else if (r.length > 2) {
        r = r.replace(/^(\d\d)(\d{0,2})/,"$1/$2");
       }
       else if (r.length > 0){
             if (r > 12) {
               r = "";
             }
       }
       return r;
    }
    
    17.01.2017
  • Это не ответ на вопрос ОП. 17.01.2017
  • истинный. Я просто знаю, что это было действительно полезно для меня, и я действительно не знал, куда добавить эти 17.01.2017
  • @NicolasGiszpencn Может быть, попробовать написать сообщение в блоге об этих функциях, чтобы поделиться? 17.01.2017
  • У меня нет блога. Есть ли место в StackOverflow для моего представления, которое по сути является дополнением к предыдущему [отчасти связанному] представлению? 18.01.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..