我们用优秀的jQuery 验证器插件 http://bassistance.de/jquery-plugins/jquery-plugin-validation/在 Stack Overflow 上,在将输入提交到服务器之前对输入进行客户端验证。
它通常运行良好,然而,这个让我们摸不着头脑。
以下验证器方法用于询问/回答表单中的用户名字段(请注意,您必须是登出在实时网站上查看此字段;它在每个/question
页面和/ask
page)
$.validator.addMethod("validUserName",
function(value, element) {
return this.optional(element) ||
/^[\w\-\s\dÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜäëïöüçÇßØøÅåÆæÞþÐð]+$/.test(value); },
"Can only contain A-Z, 0-9, spaces, and hyphens.");
现在这个正则表达式看起来很奇怪,但它非常简单:
- 匹配字符串的开头 (^)
- match any of these..
- 单词字符 (\w)
- dash (-)
- 空格 (\s)
- 数字 (\d)
- 疯狂的月亮语言字符(àèìòù 等)
- 现在匹配字符串的结尾 ($)
是的,我们遇到了国际化正则表达式 http://www.hanselman.com/blog/InternationalizedRegularExpressions.aspx问题。 JavaScript 对“单词字符”的定义根本不包括国际字符。
这是奇怪的部分:尽管我们不厌其烦地手动将大量有效的国际字符添加到正则表达式中,但它不起作用。您无法在用户名输入框中输入这些国际字符,除非得到..
只能包含 A-Z、0-9、空格和连字符
..验证返回!
明显地验证is为正则表达式的其他部分工作.. 那么.. 给出了什么?
另一个奇怪的部分是,此验证在浏览器的 JavaScript 控制台中起作用,但在作为我们标准 *.js 包含的一部分执行时不起作用。
/^[\w-\sÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÊÎÔÛâêîôûÑÕãñõäËÏÖÜäëïöüçÇßØøÅåÆæÞþÐð]+$/
.test('ÓBill de hÓra') === true
我们之前在 JavaScript 代码中遇到过一些非常奇怪的国际字符问题,导致了一些非常非常令人讨厌的黑客攻击。我们想了解这里发生了什么以及为什么。请赐教!