【问题标题】:The provided regular expression is using multiline anchors (^ or $)提供的正则表达式使用多行锚(^ 或 $)
【发布时间】:2014-09-15 03:49:51
【问题描述】:

我尝试编写一种图像验证格式,以确保 url 以 .png、.jpg 或 .gif 结尾。

class Product < ActiveRecord::Base

  mount_uploader :image_url

  validates :title, :presence => true,
            :uniqueness => true
  validates :image_url, :presence => true,
                        :format => {
                           :with => %r{\.(gif|jpg|png)$}i,
                           :message => 'must be a URL for GIF, JPG or PNG image.'
                        }
end

但是当我启动我的服务器时。看到这个:

提供的正则表达式使用了多行锚(^ 或 $),这可能会带来安全风险。您是要使用 \A 和 \z,还是忘记添加 :multiline => true 选项?

【问题讨论】:

  • 有什么问题?考虑按照它所说的去做。
  • 只需将$ 替换为\z,反正你的情况看起来是一样的。

标签: ruby-on-rails regex ruby-on-rails-4


【解决方案1】:

^$ 都是线锚。如果用户要传入带有http://www.foo.com/bar.png\nfoo_bar_baz! 的字符串,那么您的正则表达式会说输入是有效的,因为它将.png 匹配到换行符,这不是您想要的。

将上面的正则表达式改为%r{\.(gif|jpg|png)\z}i\z 是字符串锚的结尾,这是您想要的,而不是行尾锚。

关于另一个非常相似的问题有一些很好的答案:Difference between \A \z and ^ $ in Ruby regular expressions

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    相关资源
    最近更新 更多