我正在使用http://bassistance.de/jquery-plugins/jquery-plugin-validation/来验证我的表单。不幸的是,没有纯文字方法。所以我试着写自己的:
$(document).ready(function(){
$("#staffedit").validate(
{
rules: {
editDisplayName: {
textonly: true,
required: true
}
}}
);
jQuery.validator.addMethod(
"textonly",
function(value, element)
{console.log('textonly called.');
console.log(/[-.\w\s]/.test(value));
return this.optional(element) || /[-.\w\s]/.test(value);
},
jQuery.format("Please only enter letters, spaces, periods, or hyphens.")
);
});
该方法被调用,因为我的console.log函数在适当的时候输出到控制台。我不明白的是,为什么我仍然可以在输入字段中输入$或*。我可以在那里放任何东西,它仍然被评估为有效。
我使用http://regexpal.com/来测试正则表达式,并且在那里工作正常。
那么,如何让插件只允许文本,空格,句点和连字符?
在旁注中,我还想允许带有重音的字符,如à,É,ā或ô......
答案 0 :(得分:1)
问题在于test()函数的工作原理。如果匹配则返回true。这让我很困惑。我正在使用的正则表达式实际上正在做我认为他们应该做的事情。见http://www.w3schools.com/jsref/jsref_regexp_test.asp
/[^-\.a-zA-Z\s]/.test("David"); //Returns false
/[^-\.a-zA-Z\s]/.test("Davi$ *d"); //Returns true
//without the ^
/[-\.a-zA-Z\s]/.test("Davi$ *d"); //Returns true
/[-\.a-zA-Z\s]/.test("David"); //Returns true
如您所见,这不是很有帮助。所以我所做的就是将测试从退货声明中拉出来。像这样:
$(document).ready(function(){
$("#staffedit").validate(
{
rules: {
editDisplayName: {
textonly: true,
required: true
}
}}
);
jQuery.validator.addMethod(
"textonly",
function(value, element)
{
valid = false;
check = /[^-\.a-zA-Z\s\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02AE]/.test(value);
if(check==false)
valid = true;
return this.optional(element) || valid;
},
jQuery.format("Please only enter letters, spaces, periods, or hyphens.")
);
});
所以我检查一下我不想要的任何字符是否存在,如果他们没有test()返回false,那么它是有效的。
我也想出了unicode的东西。 [\ u00C0- \ u00D6 \ u00D8- \ u00F6 \ u00F8- \ u02AE]匹配一堆东西,我使用http://en.wikipedia.org/wiki/List_of_Unicode_characters来计算要放入的东西。我想我得到了我想要的一切。感谢Kyle Schmidt发布了Javascript + Unicode regexes链接,帮助我找出了\ u语法。我应该更彻底地检查unicode,但现在应该已经足够了。
问题解决了。
答案 1 :(得分:0)
如果你得到了额外的方法js,那里有一个字母验证器
http://ajax.aspnetcdn.com/ajax/jquery.validate/1.9/additional-methods.js
你想要letterswithbasicpunc我相信
答案 2 :(得分:0)
将^放在一个字符类中会否定字符类中的内容。我会去[ - 。\ w \ s]