如何使用jQuery Validation和Regex检查模式的文本区域的每一行?

时间:2015-09-04 20:41:04

标签: jquery regex jquery-validate

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

我有这样的工作,整个表单验证按照我想要的方式工作,除了它目前只检查序列号textarea的一行,而不是循环遍历每一行以找到不正确的格式化串行。

这是表单代码(我使用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 Validation代码:

   <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本身可以单独检查textarea的每一行而不循环,或者它可以吗?我还在学习Javascript,所以我不知道应该把循环放在哪里,或者当它到达一个坏的序列号时如何摆脱循环(如果发生故障,解析整个textarea没有意义)第1行。

提前感谢您的建议!

3 个答案:

答案 0 :(得分:1)

在验证程序方法中,您可以使用split()拆分值,然后如果任何行不匹配则返回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."

        );   

答案 1 :(得分:1)

好的,感谢大家的帮助。特别感谢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." 

   );   

答案 2 :(得分:0)

在JavaScript中,您可以使用var lines = $('textarea').val().split('\n')拆分新行。这会创建一个数组(类似于列表),其中所有行都是&#39; terms&#39;。然后,您可以执行for循环以完成所有这些术语:

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