2013-08-26 3 views
-1

Я хочу отфильтровать несколько почтовых индексов на входе, должно быть не менее 2 почтовых индексов, разделенных COMA, я пытаюсь проверить их в javascript со следующим кодом, но теперь он фильтрует, отправить отправить форму на следующую страницу без ошибок, кто может помочь?Несколько почтовых индексов, разделенных запятой

<script> 
function validateMULTIZIP() { 
    if(!/\d{11,}/.test(document.zipad.textfield.value) && document.getElementById('single').checked==false)) 
    { 
     alert("There should be a least two Zip codes separated by a coma."); 
     document.zipad.textfield.focus() ; 
     return false; 
    } 
    return true; 
} 
</script> 

ответ

4

Это будет проверять два 5-значных чисел, разделенных запятой

^\d{5},\d{5}$ 

Regular expression visualization

Но вы сказали, по крайней мере два, так это означает, что она должна быть немного более гибкий, чтобы разместить больше. Если пользователь вводит 12345,12345,12345, он должен быть действительным.

^\d{5}(?:,\d{5})+$ 

Regular expression visualization

Что делать, если пользователь добавляет пробел после запятой? Например, 12345, 12345. Это совершенно верно, поэтому давайте убедиться, что наш валидатор допускает это.

^\d{5}(?:,\s*\d{5})+$ 

Regular expression visualization

О, и почтовые коды могут иметь дополнительный -1234 окончание на них тоже (известный как ZIP+4. Может быть, вы хотите что-то вроде этого

^\d{5}(?:-\d{4})?(?:,\s*\d{5}(?:-\d{4})?)+$ 

Regular expression visualization

Теперь строки, подобные этому, будут действительны

  • 12345, 12345,12345
  • 12345, 12345-9999, 12345

В качестве бонуса, скажем 12345, 12345 является недействительным, поскольку он имеет тот же почтовый индекс дважды. Вот как мы исправим

(?:(\d{5}),?)(?!.*\1) 

Regular expression visualization

И вот зип +-версии

(?:(\d{5}(?:-\d{4})?),?)(?!.*\1(?!-)) 

Regular expression visualization

Это один имеет немного дополнительную сложность из-за возможности (например,) 12345, 12345-9999. Это верно, но поскольку 12345 может появляться более одного раза, он гарантирует, что 5-значный почтовый индекс не может быть аннулирован уникальным 9-значным почтовым индексом.

Примечание: эти повторяющиеся регулярные выражения не обеспечивают минимум двух уникальных почтовых индексов. Если вы хотите проверить наличие дубликатов, вам необходимо объединить их.

var valid5DigitZipCodes = function(str) { 
    if (! /^\d{5}(?:,\s*\d{5})+$/.test(str)) { 
    alert("You need at least 2 zip codes"); 
    return false; 
    } 

    else if (! /(?:(\d{5}),?)(?!.*\1)/.test(str)) { 
    alert("You entered a duplicate zip code"); 
    return false; 
    } 

    return true; 
}; 

И вот ZIP + 4 вариант, если вы хотите, чтобы поддержать это

var valid9DigitZipCodes = function(str) { 
    if (! /^\d{5}(?:-\d{4})?(?:,\s*\d{5}(?:-\d{4})?)+$/.test(str)) { 
    alert("You need at least 2 zip codes"); 
    return false; 
    } 

    else if (! /(?:(\d{5}(?:-\d{4})?),?)(?!.*\1(?!-)).test(str) { 
    alert("You entered a duplicate zip code"); 
    return false; 
    } 

    return true; 
}; 
+1

красивые диаграммы, вы используете приложение для автоматической генерации этих? – Tony

1

Предполагая (из кода), что ZIP-код содержит пять цифр и других символов, вы можете использовать:

/\d{5},\d{5}/.test(document.zipad.textfield.value) 

Вы регулярное выражение: \d{11,} означает «любая цифра, одиннадцать раз или более», вот почему она сломана.

+0

Спасибо! работаю очень хорошо, я ценю это, продолжайте хорошую работу. – user2325465

0

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

Пример кода:

<input type="text" id="in"></input> 
<button onclick="validate()">Click</button> 

JS

function validate() { 
    var inp = document.getElementById("in"); 
    var content = inp.value; 
    var correct = validateZipString(content); 
    if (correct) { 
     alert("ok"); 
    } else { 
     alert("not ok"); 
    } 
} 

function validateZipString(zipString) { 
    var zipCodes = zipString.split(','); 
    if (zipCodes.length < 2) return false; 
    for (var i = 0; i < zipCodes.length; i++) { 
     //validate each zipCode if required 
    } 
    return true; 
} 

здесь является рабочим jsfiddle http://jsfiddle.net/VcNd9/3/

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