2015-06-03 2 views
-3

В конце моего проекта, и мне нужен помощник. Мне нужно код регулярного выражения для проверки номера телефона. Если номер телефона не пуст, проверьте, что номер телефона находится в одном из следующих форматов:Проверка телефона

«xxx-xxx-xxxx» - 10 цифр с двумя штрихами, где первая тире находится между третьей и четвертой цифрами и вторая тире находится между шестым и седьмым разрядами.

«XXXXXXXXXX»»- все 10 цифр, или,

„(ххй) XXXXXXX“» - 10 цифр с первыми тремя цифрами быть вписана в круглых скобках.

'(xxx) -xxx-xxxx' - 10 цифр с первыми тремя цифрами, заключенными в круглые скобки, и имеется тире между шестым и седьмым разрядами. Также необходимо предоставить предупреждение, если номер телефона не в нужном формате. Все форматы должны быть приняты валидацией, иначе это не удастся.

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

Вот мой текущий код, но он не охватывает четыре формата.

var phone = document.myForm.phone.value; 
if (!/^\d{3}-\d{3}-\d{4}$/.test(document.myForm.phone.value)) { 
alert("Please enter the correct phone format "); 

Этот код охватывает только ххх-ххх-хххх. Можно ли охватить все форматы с помощью такого кода? Пожалуйста, это должно быть регулярное выражение, начинающееся с «var phone», как у меня в моем примере кода, или оно, как правило, становится беспорядочным.

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

+1

Возможный дубликат [Подтвердить номер телефона с помощью javascript] (http://stackoverflow.com/questions/18375929/validate-phone-number-using-javascript) –

+3

Почему бы вам не изучить регулярное выражение или использовать Google? Это общий вопрос. – moffeltje

+0

Почему бы не добавить тесты для остальных 3 шаблонов? – Xotic750

ответ

1

Regex может получить довольно сложно, если вы довольно новыми для него. В любое время, когда мне нужно протестировать некоторые регулярные выражения/найти помощь, я использую Regexr. Довольно аккуратная маленькая песочница для тестирования регулярного выражения.

Что касается вашего вопроса, я думаю, что это будет работать красиво.

var phone = [ 
 
    '555-555-5555', 
 
    '(555)-555-5555', 
 
    '(555)555-5555', 
 
    '5555555555', 
 
    '(555)5555555' 
 
    ]; 
 

 
for (var i = 0; i < phone.length; i++) { 
 
    if (!/(?:\d{1}\s)?\(?(\d{3})\)?-?\s?(\d{3})-?\s?(\d{4})/.test(phone[i])) { 
 
     console.log(phone[i]+': invalid'); 
 
    } 
 
}

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

Ваше регулярное выражение почти есть. Если вы хотите сделать что-то «необязательным», используйте ? перед тем, что вы хотите сделать необязательным. В этом случае () должен быть необязательным, поэтому \(?\d{3}\)? сделает необязательным (), но все равно вынудит \d{3}.

+0

[Почему используется «для ... в» с итерацией массива такая плохая идея?] (Http://stackoverflow.com/questions/500504/why-is-using-for-in-with-array-iteration-such- a-bad-idea) – Xotic750

+0

Мне нужно предупреждение, а не console.log. Это не работает для меня. – Bigpat

+1

@Bigpat это тест, показывающий, что он проверяет несколько разных типов номеров телефонов в одном фрагменте. Если вы хотите, чтобы он предупреждал, просто скопируйте/вставьте оператор if и измените 'console.log()' на 'alert (" whatever ")'. –

0

Вместо создания одного сложного/гигантского RegExp, почему бы не протестировать несколько простых RegExp?

var phones = [ 
 
     '', 
 
     '012-345-6789', 
 
     '(012)3456789' 
 
    ], 
 
    tests = [ 
 
     /^\d{3}-\d{3}-\d{4}$/, 
 
     /^\d{10}$/ 
 
    ], 
 
    pre = document.getElementById('out'); 
 

 
phones.forEach(function (phone) { 
 
    pre.textContent += phone + ' : '; 
 
    var pass = tests.some(function (test) { 
 
     return test.test(phone.toString()); 
 
    }); 
 
    
 
    if (pass) { 
 
     pre.textContent += 'pass'; 
 
    } else { 
 
     pre.textContent += 'fail' 
 
    } 
 
    
 
    pre.textContent += '\n'; 
 
});
<pre id="out"></pre>

Я включены только 2 правила в этом примере, но вы можете видеть, что это будет намного легче поддерживать, добавить/удалить правила.

0

(?:^\d{3}-\d{3}-\d{4}$)|(?:^\(\d{3}\)\d{3}-\d{4}$)|(?:[0-9]{10})

Это будет охватывать три примера вы упомянули.

(Если вы строите каждый пример сам по себе, то сцепить с трубой (эквивалент «или»), вы можете добавить больше ...)

Однако, если вы собираетесь сделать улов ВСЕ Действительные номера телефонов, это будет довольно длинным. В этот момент я бы предложил другой подход.

+0

Это не работает с моим кодом var phone = document.PizzaForm.phone.value; if (! (?:^\ D {3} - \ d {3} - \ d {4} $) | (?:^\ (\ D {3} \) \ d {3} - \ d { 4} $) | (?: [0-9] {10}) /. Test (document.PizzaForm.phone.value)) { предупреждение («Укажите правильный номер телефона»); } – Bigpat