2017-07-04 209 views
0

我试图让英文字母,数字值只有下列字符:正则表达式字母数字和一些某些特殊字符

- # $ % & * () [ ] , ./- _ +

我设法想出下面的代码

<form id="accountForm" action=""> 
    <input type="text" name="my_input"> 
</form> 

$(function() { 

    $.validator.addMethod("accept", function(value, element, param) { 
     return value.match(new RegExp("." + param + "$")); 
    }, 'Only English is allowed');   


    $("#accountForm").validate({ 
     rules: { 
      my_input : { 
       required: true, 
       accept: '[[email protected]%#&()/+*$,._\\-]+$' 
      }    

     } 
    }); 
}); 

但也存在一些问题:

  1. 如果我尝试添加[ ]代码完全停止工作
  2. 如果我添加其他字符或不在上面的列表中,在任何字母后它不显示任何错误消息。例如:ABC你好
  3. 如果我输入一个字母,它会给出一个错误。

这里是我的代码演示:https://jsfiddle.net/w2p1rdbd/1/

能否请你告诉我怎么解决这个问题?

非常感谢!

+1

为什么你要在accept方法中操作正则表达式('new RegExp(“。”+ param +“$”)')?您将以'。[a-zA-Z0-9 @%#&()/+*$,._\--] + $$'作为正则表达式。我在你的例子中删除了'.'和'$',添加了'^'并且它似乎正在工作。 [检查此](https://jsfiddle.net/w2p1rdbd/2/)。 – ClasG

回答

1

我看不到在accept方法中操纵正则表达式的任何需要。 (new RegExp("." + param + "$"))。这将使你的正则表达式像.[[email protected]%#&()/+*$,._\\-]+$$一样。

并且该行的开头应以^(匹配字符串的开头)为起点禁止外来字符。

我在你的榜样删除.$,增加了^“原创”的正则表达式(与^[[email protected]%#&()/+*$,._\\-]+$结束了),它似乎是工作。

您的代码修改:

$(function() { 
 

 
     $.validator.addMethod("accept", function(value, element, param) { 
 
      return value.match(new RegExp(param)); 
 
     }, 'Only English is allowed');   
 
     
 
     
 
     $("#accountForm").validate({ 
 
      rules: { 
 
       my_input : { 
 
        required: true, 
 
        accept: '^[[email protected]%#&()/+*$,._\\-]+$' 
 
       } 
 
      } 
 
     }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.16.0/jquery.validate.min.js"></script> 
 

 
<form id="accountForm" action=""> 
 
<input type="text" name="my_input"> 
 
</form>

1

首先,请注意,JavaScript有一个正则表达式类型,所以正则表达式可以指定为一个语言元素不需要指定作为一个字符串,它可以为您节省一些转义序列,并且您的语法突出显示可以帮助您更好地进行操作。

然后你正在做THIS_

"." + param + "$" 

这将改变你的正则表达式。点意味着任何类别的附加字符在开始处匹配。因此,单个角色根本不会匹配,您需要匹配字符,第二个字符必须是您指定的类。然后在最后附加$。你的原始表情中也有这个角色:'[[email protected]%#&()/+*$,._\\-]+$',所以现在你已经得到了两次。但其中一个被忽略,所以虽然这没有帮助,但这并没有什么坏处。可能你的意思是使用"^" + param + "$",因为这意味着“匹配从开始(^)到结束($),但是你不应该在变量表达式和你的函数中包含这些。

然后是[]的问题。你只需要在正则表达式中转义它们。但是你也需要为字符串转义它们,然后你需要为字符串转义正则表达式转义序列。所以很多逃跑。还要注意,这适用于破折号,但只要它是[]序列的最后部分,短划线的问题就会被忽略。所以最后你的正则表达式需要是"^[[email protected]%#&()/+*$,._\\-\\[\\]]+$"。 (开放[的转义是可选的)

但是,如果您使用文字,那么您可以只写/^[[email protected]%#&()/+*$,._\-\[\]]+$/,这是较少的转义序列。总的来说,结果如下:

$(function() { 
    $.validator.addMethod("accept", function(value, element, param) { 
     return param.test(value); 
    }, 'Only English is allowed');   


    $("#accountForm").validate({ 
     rules: { 
      my_input : { 
       required: true, 
       accept: /^[[email protected]%#&()/+*$,._\-\[\]]+$/ 
      } 
     } 
    }); 
}); 
相关问题