如何使用 jQuery 验证和正则表达式来检查文本区域每一行的模式?

How do I use jQuery Validation and Regex to check each row of a text area for a pattern?

我正在尝试使用 jQuery 验证进行一些表单验证。在表单中,我有一个用于序列号的文本区域,在该文本区域中,用户将粘贴一个特定格式的序列号,每行一个(例如从 Excel 复制)。我想遍历文本区域中的每一行并验证每个序列号的格式是否正确。如果不是,则抛出错误。如果所有序列号都检查出来,则允许提交表格。每个序列号的格式为 XXXX-XXXX-XXXX-XXXX-XXXX,其中 X 可以是任何数字或大写字母。

我已经完成了这项工作,整个表单验证都按照我想要的方式进行,除了它目前只检查序列号文本区域的一行,而不是遍历每一行以找到不正确的格式化序列号。

这是表单代码(我使用的是 ColdFusion,但这应该无关紧要):

<form name="requestForm" id="requestForm" method="post" action="">          

  <!-- Serial Numbers -->
  <label for="txtSerialNumbers">Serial Numbers
  <textarea name="txtSerialNumbers" id="txtSerialNumbers"></textarea>          

  <!-- Action Buttons -->
  <button type="submit" name="addTokens" id="addTokens" >Add Tokens</button>

</form>

这是适用于一行的 jQuery 验证代码:

   <script>

        $(document).ready( function () {

            $.validator.addMethod("checkSerials", function(value, element) {  
                    if (/^[0-9A-Z]{4}(\-[0-9A-Z]{4})(\-[0-9A-Z]{4})(\-[0-9A-Z]{4})(\-[0-9A-Z]{4})$/.test(value)) {       
                            return true; // pass when validation is correct
                    } else {
                            return false; // fail when validation fails
                    };
                }, "Please enter a valid Serial Number."

            );              

            $('#requestForm').validate( {       

                    rules: {
                            txtSerialNumbers: {
                                    checkSerials: true
                            }           
                    }                                               
            });

        });

    </script>

我假设我需要循环,因为我不认为 Regex 本身可以在不循环的情况下单独检查文本区域的每一行,或者可以吗?我还在学习 Javascript 所以我不确定我应该把循环放在哪里或者当它达到一个错误的序列号时如何打破循环(如果发生故障,解析整个文本区域毫无意义第 1 行)。

提前感谢您的建议!

在 JavaScript 中,您可以使用 var lines = $('textarea').val().split('\n') 拆分新行。这将创建一个数组(有点像列表),其中所有行都是 'terms'。然后你可以做一个 for 循环来遍历所有这些术语:

$.each(terms, function(index, value) {
    // Do regex on value variable here for just the current line
});

在您的验证器方法中,您可以使用 split() 拆分值,然后如果任何行不匹配则使用 return false。像这样:

             $.validator.addMethod("checkSerials", function(value, element) {  
                var pattern  = /^[0-9A-Z]{4}(\-[0-9A-Z]{4})(\-[0-9A-Z]{4})(\-[0-9A-Z]{4})(\-[0-9A-Z]{4})$/;
                var allLines = value.split('\n');
                foreach (var i = 0; i < allLines.length; i++)
                {
                   if (!pattern.test(allLines[i])
                   {
                       return false;
                   }
                }
                return true; // pass when validation is correct
            }, "Please enter a valid Serial Number."

        );   

好的,感谢大家的帮助。具体来说,感谢 Stephen 提供 99% 的解决方案。只需要做一些调整,它就会按照我想要的方式工作:

    $.validator.addMethod("checkSerials", function(value, element) { 

        var pattern  = /^[0-9A-Z]{4}(\-[0-9A-Z]{4})(\-[0-9A-Z]{4})(\-[0-9A-Z]{4})(\-[0-9A-Z]{4})$/;             
        var allLines = $('#txtSerialNumbers').val().split('\n');                                    

            for (var i = 0; i < allLines.length; i++)
            {
                if (!pattern.test(allLines[i]))
                {
                    return false;
                 }
            }

            return true; // pass when validation is correct                     

       }, "Please enter a valid Serial Number." 

   );