邮政编码生成器JQuery

时间:2015-12-28 19:45:02

标签: javascript jquery algorithm numbers generator

我们使用以下格式化数据获取PDF格式。

14424, 14(100-103,706), 1488(zip 5-6,3),14(100-103,706,715,402-408,112),ect...

我需要获取该数据并解析出来以生成给定的邮政编码

14424,14100,14101,14102,14103,14706,14885,14886,14883



$('form').submit(function(e) {
  $('textarea').val(parse_zip($('textarea').val()));
  e.preventDefault();
});

function parse_zip(zip_codes) {
  var valid = true;
  var formated = zip_codes.replace(/[^\d()\-,]+/g, '');
  var final_result = '';
  /*if begins with digit*/
  if (/^\d/.test(formated)) {
    final_result = formated;
  } else {
    final_result = formated;
    valid = false;
  }
  if (valid) {
    return final_result;
  } else {
    return final_result + ' = Invalid';
  }
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" integrity="sha256-7s5uDGW3AHqw6xtJmNNtr+OBRJUlgkNJEo78P4b0yRw= sha512-nNo+yCHEyn0smMxSswnf/OnX6/KwJuZTlNZBjauKhTK0c+zT+q5JOCx0UFhXQ6rJR9jg6Es8gPuD2uZcYDLqSw=="
crossorigin="anonymous">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha256-KXn5puMvxCw+dAYznun+drMdG1IFl3agK0p/pqT9KAo= sha512-2e8qq0ETcfWRI4HJBzQiA3UoyFk6tbNyG+qSaIBZLyW9Xf3sWZHN/lxe9fTh1U45DpPf07yj94KsUHHWe4Yk1A==" crossorigin="anonymous"></script>
<form>
  <textarea class='form-control input-sm' rows="10">Before: 14424, 14(100-103,706), 1488(zip 5-6,3)</textarea>
  <button type='submit'>
    submit
  </button>
</form>
<p class="help-block">
  <br>Before: 14424, 14(100-103,706), 1488(zip 5-6,3)
  <br>After: 14424,14100,14101,14102,14103,14706,14885,14886,14883
</p>
&#13;
&#13;
&#13;

我该如何解析这个?

修改

我已经开始解析项目了,但是我遇到了一些绊脚石。这是我到目前为止所做的。

&#13;
&#13;
function rangeParser(zip_codes) {
            var valid = true;
            var formated = zip_codes.replace(/[^\d()\-,]+/g, '');
            var final_result = '';
            /*if begins with digit*/
            if (/^\d/.test(formated)) {
                var newString = '';
                var openLeft = false;
                for (var i = 0, len = formated.length; i < len; i++) {
                    if (formated[i] === '(') {
                        if (openLeft) {
                            /*if two left parentheses are open, then it's invalid*/
                            valid = false;
                            break;
                        } else {
                            openLeft = true;
                        }
                    } else if (formated[i] === ')') {
                        if (openLeft) {
                            openLeft = false;
                        } else {
                            /*if no left parentheses are open and you close it with a right parenthese, the it's invalid*/
                            valid = false;
                            break;
                        }
                    } else if (formated[i] === ',') {
                        if (openLeft) {
                            /*if you are between parentheses then use the '|' as a deliminator to be split latter*/
                            newString += '|';
                        } else {
                            newString += ',';
                        }
                    } else {
                        newString += formated[i];
                    }
                }
                if (valid) {
                    /*splits the string into seperate equations*/
                    var newArray = newString.split(',');
                    var append = '';
                    var substr = [];
                    var smsplit = [];
                    var addtome = [];
                    var addnext = '';
                    for (var i = 0, len = newArray.length; i < len; i++) {
                        if (/[^\d]/g.test(newArray[i])) {
                            if (/^\d/.test(newArray[i])) {
                                /*graps the appending digits*/
                                append = /^\d+/.exec(newArray[i])[0];
                                /*gets the string that will be parsed for generating automation*/
                                substr = newArray[i].substring(append.length).replace(/[^\d\-|,]+/g, '').split('|');
                                for (var j = 0, l = substr.length; j < l; j++) {
                                    smsplit = substr[j].split('-');
                                    if (smsplit.length === 2 && parseInt(smsplit[0]) < parseInt(smsplit[1])) {
                                        if (parseInt(smsplit[0]) < parseInt(smsplit[1])) {
                                            for (var k = parseInt(smsplit[0]), leng = parseInt(smsplit[1]); k < leng; k++) {
                                                addnext = append + '' + k;
                                                if (addnext.length === 5) {
                                                    addtome.push(addnext);
                                                } else {
                                                    /*if zip is not 5 digits long, invalid*/
                                                    valid = false;
                                                    break;
                                                }
                                            }
                                        } else {
                                            /*if the ints are backwards, invalid*/
                                            valid = false;
                                            break;
                                        }
                                    } else if (smsplit.length === 1) {
                                        addnext = append + '' + smsplit[0];
                                        if (addnext.length === 5) {
                                            addtome.push(addnext);
                                        } else {
                                            /*if zip is not 5 digits long, invalid*/
                                            valid = false;
                                            break;
                                        }
                                    } else {
                                        /*if there are more than one dash, invalid*/
                                        valid = false;
                                        break;
                                    }
                                    if (!valid) {
                                        break;
                                    }
                                }
                                if (!valid) {
                                    break;
                                }
                            } else {
                                /*if the string does not start with a digit, invalid*/
                                valid = false;
                                break;
                            }
                        } else if (newArray[i].length === 5) {
                            /*if it is a 5 digit number continue*/
                            addtome.push(newArray[i]);
                            continue;
                        } else {
                            /*if it has less or more than 5 digits and no special characters then it's invalid*/
                            valid = false;
                            break;
                        }
                    }
                    if (valid) {
                        final_result = uniq_fast(addtome).join(',');
                    }
                }
            } else {
                valid = false;
            }
            if (valid) {
                return final_result;
            } else {
                return formated + ' = Invalid';
            }
        }
        function uniq_fast(a) {
            var seen = {};
            var out = [];
            var len = a.length;
            var j = 0;
            for (var i = 0; i < len; i++) {
                var item = a[i];
                if (seen[item] !== 1) {
                    seen[item] = 1;
                    out[j++] = item;
                }
            }
            return out.sort();
        }
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

这是一个基本的答案,我很想知道是否有人可以提出比我更好的答案,那就是预备它。

&#13;
&#13;
$('#sub').click(function() {
  $('textarea').val(rangeParser($('textarea').val()));
});
$('#re').click(function() {
  $('textarea').val('Before: 14424, 14(100-103,706), 1488(zip 5-6,3)');
});

function rangeParser(zip_codes) {
  var valid = true;
  var formated = zip_codes.replace(/[^\d()\-,]+/g, '');
  var final_result = '';
  var invalidtext = '';
  /*if begins with digit*/
  if (/^\d/.test(formated)) {
    var newString = '';
    var openLeft = false;
    for (var i = 0, len = formated.length; i < len; i++) {
      if (formated[i] === '(') {
        if (openLeft) {
          /*if two left parentheses are open, then it's invalid*/
          valid = false;
          invalidtext = 'two left';
          break;
        } else {
          openLeft = true;
          newString += formated[i];
        }
      } else if (formated[i] === ')') {
        if (openLeft) {
          openLeft = false;
          newString += formated[i];
        } else {
          /*if no left parentheses are open and you close it with a right parenthese, the it's invalid*/
          valid = false;
          invalidtext = 'no left';
          break;
        }
      } else if (formated[i] === ',') {
        if (openLeft) {
          /*if you are between parentheses then use the '|' as a deliminator to be split latter*/
          newString += '|';
        } else {
          newString += ',';
        }
      } else {
        newString += formated[i];
      }
    }
    if (valid) {
      /*splits the string into seperate equations*/
      var newArray = newString.split(',');
      var append = '';
      var substr = [];
      var smsplit = [];
      var addtome = [];
      var addnext = '';
      for (var i = 0, len = newArray.length; i < len; i++) {
        if (/[^\d]/g.test(newArray[i])) {
          if (/^\d/.test(newArray[i])) {
            /*graps the appending digits*/
            append = /^\d+/.exec(newArray[i])[0];
            /*gets the string that will be parsed for generating automation*/
            substr = newArray[i].substring(append.length).replace(/[^\d\-|,]+/g, '').split('|');
            for (var j = 0, l = substr.length; j < l; j++) {
              smsplit = substr[j].split('-');
              if (smsplit.length === 2 && parseInt(smsplit[0]) < parseInt(smsplit[1])) {
                if (parseInt(smsplit[0]) < parseInt(smsplit[1])) {
                  for (var k = parseInt(smsplit[0]), leng = parseInt(smsplit[1]); k <= leng; k++) {
                    addnext = append + '' + k;
                    if (addnext.length === 5) {
                      addtome.push(addnext);
                    } else {
                      /*if zip is not 5 digits long, invalid*/
                      valid = false;
                      invalidtext = 'ranged non five digit';
                      break;
                    }
                  }
                } else {
                  /*if the ints are backwards, invalid*/
                  valid = false;
                  invalidtext = 'backwards range';
                  break;
                }
              } else if (smsplit.length === 1) {
                addnext = append + '' + smsplit[0];
                if (addnext.length === 5) {
                  addtome.push(addnext);
                } else {
                  /*if zip is not 5 digits long, invalid*/
                  valid = false;
                  invalidtext = 'not five digit zip range';
                  break;
                }
              } else if (smsplit.length > 2) {
                /*if there are more than one dash, invalid*/
                valid = false;
                invalidtext = 'more than one dash';
                break;
              }
              if (!valid) {
                break;
              }
            }
            if (!valid) {
              break;
            }
          } else {
            /*if the string does not start with a digit, invalid*/
            valid = false;
            invalidtext = 'donst start with digit';
            break;
          }
        } else if (newArray[i].length === 5) {
          /*if it is a 5 digit number continue*/
          addtome.push(newArray[i]);
          continue;
        } else {
          /*if it has less or more than 5 digits and no special characters then it's invalid*/
          valid = false;
          invalidtext = 'non range not five digit';
          break;
        }
      }
      if (valid) {
        final_result = uniq_fast(addtome).join(',');
      }
    }
  } else {
    /*if starting string doesn't have digit at first*/
    invalidtext = 'begin non digit';
    valid = false;
  }
  if (valid) {
    return final_result;
  } else {
    return formated + ' = Invalid ' + invalidtext;
  }
}

function uniq_fast(a) {
  var seen = {};
  var out = [];
  var len = a.length;
  var j = 0;
  for (var i = 0; i < len; i++) {
    var item = a[i];
    if (seen[item] !== 1) {
      seen[item] = 1;
      out[j++] = item;
    }
  }
  return out.sort();
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" />
<textarea class='form-control input-sm' rows="10">Before: 14424, 14(100-103,706), 1488(zip 5-6,3)</textarea>
<button id="sub">
  submit
</button>
<button id="re">
  Reset
</button>
<p class="help-block">
  <br>Before: 14424, 14(100-103,706), 1488(zip 5-6,3)
  <br>After: 14100,14101,14102,14103,14424,14706,14883,14885,14886
</p>
&#13;
&#13;
&#13;