2013-07-01 4 views
1

Я работаю над модификацией скрипта. Сценарий содержит форму, позволяющую посетителям отправлять SMS-сообщения на телефонные номера. В форме у меня есть текстовое поле, в котором пользователи вводят номер телефона текстового ресивера. Я использую регулярное выражение для проверки номера телефона, чтобы предотвратить спамеры, и убедитесь, что пользователь напечатал правильный номер.Javascript regex для проверки номера телефона

Вот номера телефона по умолчанию, используемые в Афганистане:

+93785657024 
+93795657024 
+93700565656 
+93775657024 

Регулярное выражение проверки должны сначала убедиться, что +93 используется, убедитесь, что 78, 77, 79 или 700 (один из них) используется после +93 и, наконец, 6 цифр.

Вот код Javascript, который я пытаюсь исправить. Этот код теперь работает только для +937, за которым следуют 8 цифр.

<script type="text/javascript"> 
function test(){ 
    var phoneRegex = new RegExp('^937\d{8}$'); 
    var phoneNum = document.getElementById("receiver").value; 
    if(!(phoneRegex.test(phoneNum))) { 
    alert("Invalid Phone Number"); 
    document.getElementById("receiver").focus(); 
    } else { 
    alert("valid"); 
    } 
} 
</script> 
+2

http://stackoverflow.com/q/123559 –

+0

Либо '/^937 \ d {8} $ /' ** или ** 'новый RegExp ("^937 \\ d {8} $ ")' – Bergi

+0

@Bergi Это будет соответствовать вещам без знака плюс и комбинации, которые не подходят, как 9370, 9371, 9372, 9373, 9374, 9375, 9376 ... – dda

ответ

2

Проверка регулярных выражений должны сначала убедиться, что +93 используется, то убедитесь, что 78, 77, 79 или 700 (один из них) используется после +93 и, наконец, с последующим 6 цифр.


Этот ответ не будет работать только в 700 случае, так как OP указано, что все префиксы следовало 6 цифр, когда на самом деле только 93700 следует 6, а остальные префиксы следуют 7 цифр.

/^\+93(77\d|78\d|79\d|700)\d{6}$/ 

должны это сделать.

Ваше оригинальное регулярное выражение не требует «+» спереди.

+0

Я пробовал это, но он не работает. Я также проверил это с помощью [link] (http://www.regular-expressions.info/javascriptexample.html) и не ответил. –

+1

Этот ответ не будет работать, кроме как в случае 700, потому что ОП указал, что за всеми префиксами следуют 6 цифр, тогда как на самом деле только за 93700 следует 6, а за другими префиксами следуют 7 цифр. (Но регулярное выражение точно дает то, что запросил ОП!) –

+0

Я изменил '/^\ + 93 (77 | 78 | 79 | 700) \ d {6} $ /' to '/^\ + 93 (77 | 78 | 79 | 70) \ d {} $/', но все же он говорит недопустимое число. Я также удалил + знак. Теперь у меня есть эта строка '93 (77 | 78 | 79 | 70) \ d {7} ' –

0

Использование:

/^\+937([789]|00)\d\d\d\d\d\d$/ 

Это должно сделать это.

+937 Все ваши номера начинаются с этого
([789] | 00) либо 7, 8, 9 или 00
\ d \ d \ d \ d \ D 6 цифр

1

Я думаю, что это подойдет вашему состоянию

Всего вам нужно 11 цифр с префиксом +.

Следовательно, если 77 | 78 | 79 означает 7 цифр или 700, следует на 6 цифр.

var reg = /^\+93((77|78|79)\d{7}|700\d{6})$/; 
console.log(reg.test('+93705657024')); 

Проверить это Fiddle

1

Regular самого выражения:

var phoneRegex = new RegExp('(937(?:00\\d{6}|[789]\\d{7}))'); 

Примечание:

  • Поскольку вы используете new RegExp, я не вставил / и / вокруг выражения. (Я упоминаю об этом, потому что вы прокомментировали, что некоторые другие ответы вообще не работают, и я подозреваю, что это потому, что вы, возможно, забыли удалить/и/перед их тестированием, возможно? поэтому я также отвечаю, но другие ответы должны, по крайней мере, соответствовать некоторым действительным номерам телефонов, если вы удаляете/и /, которые окружают регулярные выражения.)
  • Вы, кажется, ошиблись при подсчете цифр и цифр. примеры, которые вы дали по действующим номерам в Афганистане. +9377, +9378 и т. Д. За ними следуют 7 цифр, а не 6, а на самом деле вместо +93700 следует 6.
  • Мое выражение ставит полный номер телефона во временную переменную $ 1, что может пригодиться. (Я использовал группу, не связанную с захватом, для альтернатив во второй части матча, потому что иногда дополнительные захваты могут беспокоить, когда я хочу сделать что-то еще с результатами матча. Для чего ваш код работает, он будет работать то же самое или с ?:, что и в моем регулярном выражении.)
  • Мое выражение не привязывает соответствие к началу или концу строки, так как это приведет к возврату false для допустимых чисел с пунктуацией, например +, что вы показали свои номера телефонов.
  • По этой же причине я предлагаю удалить нечисловые символы перед проверкой ввода для действительного номера телефона. В настоящий момент телефонные номера с использованием круглых скобок или дефис или любой традиционной пунктуации возвращают false, даже если они действительно действительны.
  • Эта модификация кода будет работать для обеспечения того, чтобы действительные телефонные номера распознаются правильно первого удаления пунктуации:

    if(!(phoneRegex.test(phoneNum.replace(/\D+/g, '')))) { 
    
  • Если вы сделаете это изменение в код, то было бы целесообразно, чтобы добавить привязки выражений ^ и $ вокруг моего предложенного регулярного выражения, чтобы убедиться, что в нем содержится только действительный номер телефона, а не более длинный номер, например номер кредитной карты.

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

<script type="text/javascript"> 
function test(){ 
    var phoneField = document.getElementById("receiver") 
    var phoneNum = phoneField.value; 
    if (/^(937(?:00\d{6}|[789]\d{7}))$/.test(phoneNum.replace(/\D+/g, ''))) { 
    alert('valid'); 
    } else { 
    alert('Invalid phone number'); 
    phoneField.focus(); 
    } 
} 
</script> 
<input id="receiver" value="+93785657024" /> 
<input type="button" onclick="test()" value="Check this number" /> 

Примечание: Я немного перепутал код. Пожалуйста, проигнорируйте мой другой код (тот, который был загружен на эту ссылку, я имею в виду). Это работает.

+0

Спасибо за подробное объяснение. Я удалил знак +, как вы сказали. 'var phoneRegex = новый RegExp ("93 (77 | 78 | 79 | 70) \ d {7}"); но все же он возвращает ошибку. –

+0

Попробуйте вставить всю строку кода, которую я написал. var phoneRegex = новый RegExp ('(937 (?: 00 \ d {6} | [789] \ d {7}))'); (Я тоже тестировал его, и он работает для меня.) –

+0

Я вставил весь код, а затем проверил с этим номером 93700600708, поэтому он говорит о некорректном номере телефона. –

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