在 Stack Overflow,我们使用优秀的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) - 其他语言的字符 (àèìòù等)
- 匹配字符串结尾 ($)
是的,我们遇到了国际化正则表达式问题。JavaScript中"单词字符"的定义完全不包括国际字符。
奇怪的是,即使我们手动添加了大量有效的国际字符到正则表达式中,它也无法正常工作。你不能在用户名输入框中输入这些国际字符而不会得到验证错误:"只能包含A-Z、0-9、空格和短横线"。
显然,验证对于正则表达式的其他部分确实起作用,那么问题出在哪里呢?
另一个奇怪的地方是,这个验证在浏览器的JavaScript控制台中可以正常工作,但在我们标准的*.js文件中执行时却不行。
我们之前在JavaScript代码中遇到过一些非常奇怪的国际字符问题,导致出现了一些非常恶心的hack。我们希望能够理解这里发生了什么以及为什么会发生。请给我们一些启示!正则表达式如下: /^[\w-\sÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜäëïöüçÇßØøÅåÆæÞþÐð]+$/ .test('ÓBill de hÓra') === true