我正在尝试仅允许使用英文字母,数值和以下字符:
- # $ % & * ( ) [ ] , . / - _ +
我设法提出以下代码
<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: '[a-zA-Z0-9@%#&()/+*$,._\\-]+$'
}
}
});
});
但是有一些问题:
[ ]
,则代码完全停止工作以下是我的代码演示:https://jsfiddle.net/w2p1rdbd/1/
你能告诉我如何解决这个问题吗?
非常感谢!
答案 0 :(得分:1)
我没有看到在accept方法中操纵正则表达式的任何需要。 (new RegExp("." + param + "$")
)。这将使您的regexend像.[a-zA-Z0-9@%#&()/+*$,._\\-]+$$
一样。
该行的开头应该以{{1}}(匹配字符串的开头)为基础,以便在开头禁止外来字符。
我在您的示例中移除了^
和.
,将$
添加到&#34;原始&#34;正则表达式(以^
结束)并且它似乎正在起作用。
您的代码已修改:
^[a-zA-Z0-9@%#&()/+*$,._\\-]+$
&#13;
$(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: '^[a-zA-Z0-9@%#&()/+*$,._\\-]+$'
}
}
});
});
&#13;
答案 1 :(得分:1)
首先,请注意JavaScript具有正则表达式类型,因此可以将正则表达式指定为不需要指定为字符串的语言元素,这样可以节省几个转义序列以及语法突出显示可以帮助你更好。
然后你这样做_
"." + param + "$"
这会改变你的正则表达式。点表示任何类的附加字符在开头匹配。因此,单个角色根本不匹配,您需要匹配的角色,第二个角色必须属于您指定的类别。然后你还在最后添加$
。你的原始表达中也有这个角色:'[a-zA-Z0-9@%#&()/+*$,._\\-]+$'
,所以现在你得到了两次。但是其中一个被忽略了,所以虽然这没有用,但没有坏处。可能你打算使用"^" + param + "$"
,因为那意味着从开头(^
)到结尾($
)匹配,但是你不应该在两者中包括这些变量表达式和函数。
然后是[]
的问题。你只需要在正则表达式中逃脱它们。但是你还需要为字符串转义它们,然后你需要转义字符串的正则表达式转义序列。所以很多逃脱。另请注意,这适用于破折号,但破折号的问题只要是[]
序列的最后一部分就会被忽略。所以最后你的正则表达式需要"^[a-zA-Z0-9@%#&()/+*$,._\\-\\[\\]]+$"
。 (开场[
的转义是可选的)
但是如果你使用文字,那么你可以写/^[a-zA-Z0-9@%#&()/+*$,._\-\[\]]+$/
,这是一个较少的转义序列。结果总是如此:
$(function() {
$.validator.addMethod("accept", function(value, element, param) {
return param.test(value);
}, 'Only English is allowed');
$( "#accountForm" ).validate({
rules: {
my_input : {
required: true,
accept: /^[a-zA-Z0-9@%#&()/+*$,._\-\[\]]+$/
}
}
});
});