【发布时间】:2010-11-07 14:06:49
【问题描述】:
我们在 Stack Overflow 上使用出色的 validator plugin for jQuery 在将输入提交到服务器之前对其进行客户端验证。
它通常运作良好,但是,这让我们摸不着头脑。
以下验证器方法用于用户名字段的询问/回答表单(请注意,您必须退出才能在实时站点上看到此字段;它位于每个 /question页面和/ask 页面)
$.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.");
现在这个正则表达式看起来很奇怪,但其实很简单:
- 匹配字符串的开头 (^)
- 匹配其中任何一个..
- 单词字符 (\w)
- 破折号 (-)
- 空格(\s)
- 数字 (\d)
- 疯狂的月亮语言字符(àèìòù等)
- 现在匹配字符串的结尾 ($)
是的,我们遇到了Internationalized Regular Expressions 问题。 JavaScript 对“单词字符”的定义根本不包括国际字符。
这是奇怪的部分:即使我们已经麻烦手动将大量有效的国际字符添加到正则表达式,它不起作用。你不能在用户名的输入框中输入这些国际字符而不得到..
只能包含 A-Z、0-9、空格和连字符
.. 验证返回!
显然验证适用于正则表达式的其他部分.. 那么.. 什么给出了?
另一个奇怪的部分是,此验证在浏览器的 JavaScript 控制台中有效,但在作为我们的标准 *.js 包含的一部分执行时无效。
/^[\w-\sÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜäëïöüçÇߨøÅ寿ÞþÐð]+$/ .test('ÓBill de hÓra') === true
我们之前在 JavaScript 代码中遇到过一些非常奇怪的国际字符问题,导致了一些非常非常讨厌的黑客攻击。我们想了解这里发生了什么以及为什么。请赐教!
【问题讨论】:
-
这可能是字符编码问题吗?即,来自用户的疯狂月亮“Ä”不是您的正则表达式中的“Ä”?
-
我不知道答案,但这是写问题的好方法。
-
@Onorio Jeff 总是提倡提出写得很好的问题,所以他最好自己也这样做 :-) 但你肯定是对的。
-
é 不是来自月球语言的字符,神奇宝贝在英文字母表中不是吗?另请查看我的评论 Jorn 回答
标签: javascript jquery validation internationalization