2016-03-26 6 views
1

У меня есть плагин проверки jQuery на странице. Когда кто-то набирает номер телефона в поле формы, я хочу валидатора распознавать только определенный формат (RU):Проверка правильности регулярного выражения jQuery

+#(###)-###-##-## 
or 
+#-###-###-#### 
or 
+#-###-###-##-## 
or 
+########### 

У меня есть это в .js файле:

$.validator.addMethod('customphone', function (value, element) { 
    return this.optional(element) || /^\+d{1}(\d{3})\d{7}$/.test(value); 
}, "Please enter a valid phone number"); 

$(document).ready(function() { 
    $('form').validate({  
     rules: { 
      phone: 'customphone' 
     } ... 

Это не работая для меня, кто-нибудь видит, почему? Или есть лучший способ сделать это? :)

+1

'd' соответствует' d' алфавиту. Вы хотите, чтобы '\ d' соответствовал цифрам. ')' необходимо убежать, чтобы совместить замыкающую скобу – Tushar

+0

Кроме того, она будет соответствовать только строке из 11 цифр – gurvinder372

+0

@ gurvinder372 sry i missed. + # - ### - ### - ## - ## - это правильно – phen0men

ответ

3

Вам необходимо следующее регулярное выражение:

/^\+(?:\d(?:\(\d{3}\)|-\d{3})-\d{3}-(?:\d{2}-\d{2}|\d{4})|\d{11})$/ 

ВИДЕТЬ regex demo

regex у вас есть ^\+d{1}(\d{3})\d{7}$ имеет d вместо \d (при этом не удалось сопоставить цифры) и неизолированные круглые скобки (поэтому шаблон не соответствовал буквальным круглым скобкам).

Разбивка:

  • ^ - начало строки
  • \+ - буквальный символ +
  • (?:\d(?:\(\d{3}\)|-\d{3})-\d{3}-(?:\d{2}-\d{2}|\d{4})|\d{11}) - две альтернативы:

    • \d(?:\(\d{3}\)|-\d{3})-\d{3}-(?:\d{2}-\d{2}|\d{4}):
      • \d - цифра
      • (?:\(\d{3}\)|-\d{3}) - либо (123), как подстроки или -123 подстроки
      • -\d{3} - дефис следует с 3-х цифрами
      • - - дефис
      • (?:\d{2}-\d{2}|\d{4}) - 2 цифры следует с дефисом и 2 цифры или 4 цифры
    • | - или
    • \d{11} - 11 цифр
  • $ - конец строки

1

Это не работает для меня, кто-нибудь видит, почему? Или есть ли способ сделать это лучше? ? :)

Есть несколько проблем с кодом

  1. Как Tushar отметил, d будет соответствовать только d, чтобы соответствовать цифре вам нужно \d

  2. Ваше регулярное выражение не предоставляет для многих вещей, включая (###) и -

Я думаю, что вы ищете для этого регулярного выражения

/^\+\d(\(\d{3}\)){0,1}(\-){0,1}\d{2,3}(\-){0,1}\d{2,3}(\-){0,1}\d{2,3}$/g 

Это будет соответствовать для

/^\+\d(\(\d{3}\)){0,1}(\-){0,1}\d{2,3}(\-){0,1}\d{2,3}(\-){0,1}\d{2,3}$/g.test("+4(222)-33-33-33"); //true 
/^\+\d(\(\d{3}\)){0,1}(\-){0,1}\d{2,3}(\-){0,1}\d{2,3}(\-){0,1}\d{2,3}$/g.test("+4(222)-333-333-333"); //true 
/^\+\d(\(\d{3}\)){0,1}(\-){0,1}\d{2,3}(\-){0,1}\d{2,3}(\-){0,1}\d{2,3}$/g.test("+4(222)333333333"); //true 
/^\+\d(\(\d{3}\)){0,1}(\-){0,1}\d{2,3}(\-){0,1}\d{2,3}(\-){0,1}\d{2,3}$/g.test("+4333333333"); //true 
+0

Это не так, поскольку вы не сбежали (и) персонаж – gurvinder372

+0

+88888888888 (11 символов) - это не работает. '/^\ + \ Д (\ (\ d {3} \)) {0,1} (\ -) {0,1} \ d {2,3} (\ -) {0,1} \ д {2,3} (\ -) {0,1} \ d {2,3} $/g.test ("+ 4333333333"); '- всего 10 символов, мне нужно 11. Пожалуйста, помогите! – phen0men

1

Я не уверен, что о вашем JavaScript, но здесь различные регулярные выражения вы должны проверить .... Я надеюсь, что это помогает ,

+#(###)-###-##-## 
^\+\d{1}\(\d{3}\)\-\d{3}\-\d{2}\-\d{2}$ 
+#-###-###-#### 
^\+\d{1}\-\d{3}\-\d{3}\-\d{4}$ 
+#-###-##-## 
^\+\d{1}\-\d{3}\-\d{2}\-\d{2}$ 
+########### 
^\+\d{11}$ 

Так что я бы настроить телефон действует флаг и проверить каждое регулярное выражение значение, чтобы определить, если один из них верно этот флаг для истинно, и было бы подтвердить свой номер телефона.

var phoneValid = false; 

if(test1 == true || test2 == true || test3 == true || test4 == true) { 
    phoneValid = true; 
} else { 
    phoneValid = false; 
}