Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2015, 12:27   #1
der90
Пользователь
 
Регистрация: 12.02.2014
Сообщений: 73
По умолчанию регулярные выражения

Добрый день!
Суть проблемы, нужно подменять маску в зависимости от введенных данных
Вся информация о нужных масках хранится в json
Код:
[
    { "mask": "+380(__)___-__-__", "code": "380",  "name_ru": "Украина", "reg": "/^(380)(\\d{9})/"},
    { "mask": "+7(___)___-__-__", "code": "7",  "name_ru": "Россия", "reg": "/^(7|8)(\\d{11})/"},
    { "mask": "+48(___)___-___", "code": "48",  "name_ru": "Польша", "reg": "/^(48)(\\d{9})/"}
]
я получаю данные от пользователя но пробегаюсь на совпадения и подставляю нужную маску

Код:
 $.getJSON('/js/phone-codes.json', function (answ) {
                        var mask = answ;
                        var phone = $("input[name=phone]").val();

                        for(key in mask){
                                 console.log(mask[key]['name_ru']+ " = " + mask[key]['mask'] + " + " + mask[key]['reg']);
                            var re = new RegExp(mask[key]['reg']);
                            if(re.test(phone))
                            {
                               $("input[name=phone]").mask(mask[key]['mask'].replace(/_/g, "9"),{placeholder:"_"});
                                break;
                            }
                        }

                    });
но строки
Код:
   var re = new RegExp(mask[key]['reg']);
                            if(re.test(phone))
не срабатывают, почему не пойму
der90 вне форума Ответить с цитированием
Старый 26.01.2015, 13:05   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,619
По умолчанию

Когда создаете объект регулярного выражения при помощи конструктора RegExp, слеши в начале и конце использовать не нужно.

Например:
Код:
var incorrectRE = new RegExp('/^(380)(\\d{9})/'); // неправильно
var correctRE = new RegExp('^(380)(\\d{9})'); // правильно
И еще, проверьте свои регулярные выражения на правильность срабатывания. Круглые скобки в регулярном выражении означают группирование, но вы нигде не используете эти группы, поэтому если у вас в исходной строке могут быть скобки - экранируйте их в регулярном выражении.

И еще одно - если используете индикатор начала (^), то используйте и индикатор конца выражения ($). В данном случае это убережет вас от ложных срабатываний, если кто-то захочет после номера телефона вставить буквы или еще какие-то символы.

Например, регулярное выражение для украинских номеров может быть переписаное следующим образом:

Код:
var uaPhoneReg = new RegExp('^[\\+]{0,1}380\\d{9}$');
uaPhoneReg.test('+380961111111'); // true
uaPhoneReg.test('380961111111'); // true
Подхватывает варианты +380961111111 и 380961111111.

Можете подобрать то, что вам подходит на сайте - http://regexplib.com/

По поводу же общего кода, мой вам совет - используйте Array functions, в данном случае map. Вам не нужно будет использовать key и обращаться к элементам массива по именам.

Код:
$.getJSON('/js/phone-codes.json', function (answ) {
  var mask = answ;
  var phone = $("input[name=phone]").val();

  answ.map(function(maskObj) {
    console.log(maskObj.name_ru+ " = " + maskObj.mask + " + " + maskObj.reg);
    var re = new RegExp(maskObj.reg);
    if(re.test(phone)) {
      $("input[name=phone]").mask(maskObj.mask.replace(/_/g, "9"),{placeholder:"_"});
      break;
    }
  });
});
Или даже лучше - использовать filter

Код:
$.getJSON('/js/phone-codes.json', function (answ) {
  var mask = answ;
  var phone = $("input[name=phone]").val();

  var matchedMasks = answ.filter(function(maskObj) {
    console.log(maskObj.name_ru+ " = " + maskObj.mask + " + " + maskObj.reg);
    return (new RegExp(maskObj.reg)).test(phone);
  });
  
  if(matchedMasks && matchedMasks.length) {
    $("input[name=phone]").mask(matchedMasks[0].mask.replace(/_/g, "9"),{placeholder:"_"});
  }
  else {
    // обработка ошибки
  }
});

Последний раз редактировалось MaTBeu; 26.01.2015 в 13:17.
MaTBeu вне форума Ответить с цитированием
Старый 26.01.2015, 13:10   #3
der90
Пользователь
 
Регистрация: 12.02.2014
Сообщений: 73
По умолчанию

ок, спасибо большое, особенно за замечания по регулярным, они для меня пока темный лес(
der90 вне форума Ответить с цитированием
Старый 26.01.2015, 13:19   #4
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,619
По умолчанию

Цитата:
Сообщение от der90 Посмотреть сообщение
ок, спасибо большое, особенно за замечания по регулярным, они для меня пока темный лес(
Они и для меня темные, я обычно пользуюсь сайтом, который я вам скинул.
MaTBeu вне форума Ответить с цитированием
Старый 26.01.2015, 14:03   #5
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

А когда ты эту проверку проводишь?
При вводе? Если да, то ты напрасно аяксы гоняешь, лучше закешировать при старте.
При отправке? Тогда зачем это тут проверять, а не на сервере?
При старте? Тога поле еще пустое.
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 26.01.2015, 15:11   #6
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,619
По умолчанию

Цитата:
Сообщение от Naive Посмотреть сообщение
А когда ты эту проверку проводишь?
При вводе? Если да, то ты напрасно аяксы гоняешь, лучше закешировать при старте.
При отправке? Тогда зачем это тут проверять, а не на сервере?
При старте? Тога поле еще пустое.
Насчет отправки не согласен. Зачем отправлять запрос на сервер, если заведомо невалидный ввод можно отсечь на клиенте?
MaTBeu вне форума Ответить с цитированием
Старый 26.01.2015, 15:46   #7
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Цитата:
Сообщение от MaTBeu Посмотреть сообщение
Насчет отправки не согласен. Зачем отправлять запрос на сервер, если заведомо невалидный ввод можно отсечь на клиенте?
Ну ты не совсем верно меня понял. Меня смутила проверка в реакции на ajax.
Так то да, конечно, лишним не будет.
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 26.01.2015, 16:15   #8
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,619
По умолчанию

Цитата:
Сообщение от Naive Посмотреть сообщение
Ну ты не совсем верно меня понял. Меня смутила проверка в реакции на ajax.
Так то да, конечно, лишним не будет.
Согласен, в ajax callback проверять это все - сомнительная затея. Да и вообще я вижу, проще кешировать эти все коды, а потом поставить на поле ввода функцию-обработчик с debounce, и там уже проверять.
MaTBeu вне форума Ответить с цитированием
Старый 28.01.2015, 14:37   #9
der90
Пользователь
 
Регистрация: 12.02.2014
Сообщений: 73
По умолчанию

Цитата:
Сообщение от Naive Посмотреть сообщение
А когда ты эту проверку проводишь?
При вводе? Если да, то ты напрасно аяксы гоняешь, лучше закешировать при старте.
При отправке? Тогда зачем это тут проверять, а не на сервере?
При старте? Тога поле еще пустое.
Проверяется при старте, форма вытаскивается аяксом и уже с номером, номер всегда заранее известен, но только в формате 777788877, после как форма получена я уже подбираю маску
der90 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Регулярные выражения kilogram PHP 4 10.06.2012 00:44
регулярные выражения Sparky Помощь студентам 4 18.04.2012 18:58
регулярные выражения CodeNOT PHP 2 12.02.2012 14:00
регулярные выражения vvsh PHP 3 22.04.2011 17:09
регулярные выражения Dimarik PHP 10 09.12.2010 21:19