2009-11-25 4 views
0

я использовал следующий шаблон для регулярного выражения для номер телефонаПроблема с регулярным выражением!

pattern="[0-9 -+]+$"; 

Телефонный номер может содержать цифры, дефис (-), пространство и плюс (+). Он работает, когда я использую только цифры. Когда используются числа и алфавиты, он не работает.

В чем может быть проблема, пожалуйста, дайте мне знать.

Заранее спасибо

+3

Значит, '9 ++ 23 ++ - 13' является действительным номером телефона? – Amarghosh

ответ

7

Он интерпретирует - как часть диапазона. попробуйте это:

pattern="^[0-9 +-]+$"; 

В - либо потребности побега (\-) или перемещение к концу, как это (спасибо Тиму).

+0

Это тоже работает «^ [\ d \ s \ - \ +] + $" –

+0

Я немного отредактировал ответ: «+» не нужно экранировать, и он тоже не делает - если вы положите его в начале или конец класса символов. –

+0

@Tim - Да, правда. Теперь яснее. Я отредактирую, чтобы объяснить дальше. –

1

Она должна начинаться с^и - нужно экранировать с \

pattern=/^[0-9 \-+]+$/; 

Он должен начать с ^, что и является якорем для начала строки, если вы Бесполезный 't он будет проверять строки, которые начинаются с чего угодно, если они заканчиваются номером, пробелом, или +

- необходимо экранировать, поскольку это специальный символ и имеет значение, отличное от -. В то время как + является специальным символом, и если вы хотите рассматривать его как + вне класса, его нужно экранировать, когда внутри класса необходимо только экранировать ]^-\.

Так за пределами класса побег

.^$|*+?()[{\ 

И внутри побега:

]^-\ 

Однако, большинство реализаций позволяют избежать всех 12 специальных символов внутри классов без ошибок, и они будут только дать если вы избежите неспециального символа, что означает, что это (обратите внимание на дополнительный \ перед плюсом) также будет работать нормально.

pattern="^[0-9 \-\+]+$" 



Я всегда считаю, что использование a regex tester делает вещи проще, так как это позволяет мне видеть ошибки.

+0

Одна ошибка, исправленная за 20 секунд, и я получаю нисходящее движение? – Yacoby

1

С - (тире) используется как символ диапазона внутри скобок в регулярном выражении, вам необходимо либо избежать его, или поместить его в последний раз:

pattern="[0-9 \-+]+$"; 
// or 
pattern="[0-9 +-]+$"; 

Вы также можете начать регулярное выражение с ^, чтобы убедиться, что вся строка соответствует его, а не только конец:

pattern="^[0-9 +-]+$"; 
4

Ваше регулярное выражение будет нарушаться даже после внесения поправки, предложенной Дэвидом. Потому что он соответствует любой комбинации одного или нескольких чисел и +, -.Например, он соответствует 99++++--12

Вот лучший вариант, который соответствует номерам в формате 999-999-9999 с необязательным кодом страны в формате (длинном от двух до четырех цифр) +9999

(\+\d{2,4}\s*)?(\d{3})-(\d{3})-(\d{4}) 
+0

Ну, это не соответствует номерам в Великобритании, если вы не помещаете в них дефисы в нечетных местах. Правильная международная форма для лондонского номера, например, будет +44 20 xxxx xxxx. –

+0

Соответствие всем локалям - трудная задача (в Индии это '+91 \ d {10}') - вот почему я специально сказал, что это соответствует 3 + 3 + 4 числам. Я просто указывал на ошибки '[0-9 + -]' pattern. – Amarghosh

Смежные вопросы