gpt4 book ai didi

ruby-on-rails - 尝试为 Rails 中的用户名验证编写 REGEX

转载 作者:数据小太阳 更新时间:2023-10-29 07:11:29 26 4
gpt4 key购买 nike

我正在尝试用 Ruby (Rails) 编写一个正则表达式,以便用户名的字符仅包含数字和字母(也没有空格)。

我有这个正则表达式,/^[a-zA-Z0-9]+$/,但它似乎没有用,我在 Rails 中收到一个错误,说“The如果正则表达式使用多行 anchor (^ 或 $),这可能会带来安全风险。您是要使用\A 和\z,还是忘记添加 :multiline => true 选项?"

我的 user.rb 模型中此实现的完整代码是:

class User < ActiveRecord::Base
before_save { self.email = email.downcase }
validates :name, presence: true, length: { maximum: 50 }
VALID_USERNAME_REGEX = /^[a-zA-Z0-9]+$/
validates :username, presence: true, length: { maximum: 20 },
format: { with: VALID_USERNAME_REGEX },
uniqueness: { case_sensitive: false }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 255 },
format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
has_secure_password
validates :password, length: { minimum: 6 }
end

我做错了什么以及如何修复此正则表达式,使其仅对数字和字母有效而不对空格有效?谢谢。

最佳答案

简短回答:使用 /\A[a-zA-Z0-9]+\z/ 代替(因为 VALID_EMAIL_REGEX 正在使用)。

长答案:^$ anchor 将匹配字符串中 的开头和结尾。这意味着如果您的字符串由多行字母数字字符组成,它们将匹配:

/^[a-zA-Z0-9]+$/ =~ "Ana\nBob\nClara\nDaniel"  #=> 0 (matches)

另一方面,\A\z 将匹配 string 的开头和结尾,因此它将防止可能的用户发送多行字符串进行攻击(如上例所示)。

/\A[a-zA-Z0-9]+\z/ =~ "Ana\nBob\nClara\nDaniel"  #=> nil (doesn't match)
/\A[a-zA-Z0-9]+\z/ =~ "Erika" #=> 0 (matches)

关于ruby-on-rails - 尝试为 Rails 中的用户名验证编写 REGEX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26900382/

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