允许特定的产品代码,警告并删除重复项

时间:2019-05-09 12:39:52

标签: javascript jquery

首先,我是javascript和jQuery的新手。

我已经做了一些研究,人们说最好将白名单比黑名单做。

所以我想到了只允许粘贴/扫描/写入textarea特定的产品代码,例如:

  

7AHT182019Y00867F03281P

     

7AHT182019Y00293F0281P

     

7AHT182019Y00672F021543P

18是星期,2019是年,产品编号867,产品数量3281。

在扫描时,两次将产品代码写入或粘贴到文本区域中,都会发出警告7AHT182019Y00293F0281P this product code already exists in textarea

我已经尝试过过滤,indexOf和每个事件处理程序。

首先将textarea值转换为数组并将其拆分并使用indexOf处理程序。

此代码表示10位数字必须是数字。它必须以7,8或9开头。但是我想更具体一点:

    jQuery(document).ready(function() {
        validateNumbers();
        $('#mobile_numbers').keyup(function() {
            if (/\D/g.test(this.value)) {
                this.value = this.value.replace(/\D/g, '');
            }
            this.value = this.value
                .replace(/[\n\r]+/g, "")
                .replace(/(.{10})/g, "$1\n");
            validateNumbers();
        });

        function validateNumbers() {
            var value = $("#mobile_numbers").val();
            var numbersArray = value.split('\n');
            var validNumbers = [];
            var duplicateNumbers = [];
            var inValidNumbers = [];

            // remove empty elements
            var index = numbersArray.indexOf("");
            while(index !== -1)
            {
                numbersArray.splice(index,1);
                index = numbersArray.indexOf("");
            }

            for (var $i = 0; $i < numbersArray.length; $i++) {
                var number = numbersArray[$i];
                if (validNumbers.indexOf(number) !== -1 || inValidNumbers.indexOf(number) !== -1) {
                    duplicateNumbers.push(number);
                } else if (number.match(/[789]\d{9}/)) {
                    validNumbers.push(number);
                } else {
                    inValidNumbers.push(number);
                }
            }
            $("#total").text(numbersArray.length);
            $("#duplicate").text(duplicateNumbers.length);
            $("#valid").text(validNumbers.length);
            $("#invalid").text(inValidNumbers.length);
        }
    });

它应以7AHT开头。周应为18,年应为2019Y

00867F是产品代码,它也可以是特定的,因为它不会更改。

唯一更改的是产品数量:03281P

如果您第二次尝试扫描同一产品,它应该警告它为重复产品,并且不应将此产品代码添加到textarea。

1 个答案:

答案 0 :(得分:1)

如果您想确定文本是否以特定字符串(7AHT182019Y00672F)开头,则可以使用正则表达式:

var res = number.match(/^7AHT182019Y00672F([^\s]+)/);

如果res不为空,则匹配,结果将包含整数和固定部分后紧跟字符串的部分,例如7AHT182019Y00672F1234567,1234567,其中1234567是非固定部分。 U可以简单地用定界符,:

对其进行拆分。
var parts = res.split(",");
var fixed = parts[0];
var nonfixed = parts[1];

或仅查找搜索字符串的位置:

number.indexOf("7AHT182019Y00672F") === 0

位置0表示文本在位置0上包含搜索字符串,因此文本以此字符串开头。