gpt4 book ai didi

JavaScript 验证国际字符的问题

转载 作者:行者123 更新时间:2023-12-03 21:41:21 25 4
gpt4 key购买 nike

我们使用优秀的validator plugin for jQuery在 Stack Overflow 上,在将输入提交到服务器之前对输入进行客户端验证。

它通常运行良好,但是,这个让我们摸不着头脑。

以下验证器方法用于用户名字段的询问/回答表单(请注意,您必须注销才能在实时网站上看到此字段;它位于每个/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 对“单词字符”的定义根本不包括国际字符。

这里有一个奇怪的部分:尽管我们不厌其烦地手动将大量有效的国际字符添加到正则表达式中,但它不起作用。您无法在用户名输入框中输入这些国际字符,除非得到..

Can only contain A-Z, 0-9, spaces, and hyphens

..验证返回!

显然验证适用于正则表达式的其他部分..那么..给出了什么?

另一个奇怪的部分是,此验证在浏览器的 JavaScript 控制台中起作用,但在作为我们标准 *.js 包含的一部分执行时不起作用。

/^[\w-\sÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜäëïöüçÇßØøÅåÆæÞþÐð]+$/ .test('ÓBill de hÓra') === true

我们之前在 JavaScript 代码中遇到过一些非常奇怪的国际字符问题,导致了一些非常非常令人讨厌的黑客攻击。我们想了解这里发生了什么以及为什么。请赐教!

最佳答案

我认为电子邮件和网址验证方法在这里是一个很好的引用,例如。电子邮件方式:

email: function(value, element) {
return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value);
},

The script to compile that regex .

换句话说,用此替换任意的“crazy Moon”字符列表可能会有所帮助:

[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]

基本上,通过用更通用的定义替换需要编码的字符,可以避免在其他地方遇到的字符编码问题。虽然不一定更具可读性,但到目前为止它比您的完整列表要短。

关于JavaScript 验证国际字符的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1073412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com