最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Multiple zip codes separated by a comma - Stack Overflow

programmeradmin1浏览0评论

I want to filter multiple zip codes in an input, there should be at least 2 zip SEPARATED by a COMA, I am trying to validate them in javascript with the following code but it's now filtering, the submit send the form to the next page without error, anyone can help?

<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 a." );
         document.zipad.textfield.focus() ;
         return false;
    }
    return true;
}
</script>

I want to filter multiple zip codes in an input, there should be at least 2 zip SEPARATED by a COMA, I am trying to validate them in javascript with the following code but it's now filtering, the submit send the form to the next page without error, anyone can help?

<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 a." );
         document.zipad.textfield.focus() ;
         return false;
    }
    return true;
}
</script>
Share Improve this question edited Aug 26, 2013 at 16:53 DevlshOne 8,4571 gold badge30 silver badges37 bronze badges asked Aug 26, 2013 at 16:49 Farouk TawtawFarouk Tawtaw 682 silver badges9 bronze badges
Add a ment  | 

4 Answers 4

Reset to default 7

This will check for two 5-digit numbers separated by a ma

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

But, you said at least two, so that means it needs to be a little more flexible to acmodate more. If the user enters 12345,12345,12345 it needs to be valid.

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

What if the user adds a space after the ma? Such as 12345, 12345. This is perfectly valid, so let's make sure our validator allows that.

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

Oh, and zip codes can have an optional -1234 ending on them, too (known as ZIP+4. Maybe you want something like this

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

Now strings like this would be valid

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

As a bonus, let's say 12345, 12345 is invalid because it has the same zip code twice. Here's how we'd fix that

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

And here's the ZIP+4 version

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

This one has a little added plexity because of possibility of (e.g.,) 12345, 12345-9999. This is valid but because 12345 can appear more than once, it makes sure that a 5-digit zip code can't be invalidated by a unique 9-digit zip code.

Note these duplicate-checking regexps do not enforce the minimum of two unique zip codes. If you want to check for duplicates you'd need to bine the two.

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;
};

And here's the ZIP+4 variant if you want to support that

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;
};

Assuming (from your code) that ZIP code contains five digits and no other characters, you could use:

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

You regex: \d{11,} means "any digit, eleven times or more", that's why it's broken.

Another Solution without using regex would be splitting zip Codes by ma then check for the size of the resulting array.

Sample code:

<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;
}

here is a working jsfiddle http://jsfiddle/VcNd9/3/

For anyone else interested in the variant that also matches 1 zip or more rather than two or more. Simply change the + quantifier for * at the end of the expression.

From:

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

To:

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

For example:

<input type="text" inputmode="numeric" pattern="^\d{5}(?:-\d{4})?(?:,\s*\d{5}(?:-\d{4})?)*$">

发布评论

评论列表(0)

  1. 暂无评论