提供的正则表达式使用多行锚点(^或$)

时间:2014-07-23 19:32:01

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

我尝试编写一个图片验证格式,确保网址以.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 =&gt;真的选择?

1 个答案:

答案 0 :(得分:15)

^$都是行锚。如果用户要使用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