3

我是 Ruby 和 Rails 的新手,如果这是一个简单的问题,请原谅我。我试图检查用户何时在我的表单中传入 IMG url,它是一个有效的 url。这是我的代码:

if params[:url].include? 'http://' && (params[:url].include? '.jpg' || params[:url].include? '.png')

这返回和错误。这甚至是最好的方法吗?我应该怎么做?谢谢。

4

3 回答 3

15
if my_str =~ %r{\Ahttps?://.+\.(?:jpe?g|png)\z}i

正则表达式解释:

  • %r{...}— 类似于 的正则表达式文字/.../,但允许/在内部使用而无需转义
  • \A— 字符串的开头(^只是行的开头)
  • http — 文字文本
  • s? — 可选地后跟一个“s”(允许 https://)
  • ://- 文字文本(以防止类似的东西http-whee.jpg
  • .+ — 一个或多个字符(不是换行符)
  • \. - 一个字面句号(确保这是我们正在查看的扩展名)
  • (?:aaa|bbb)— 允许aaabbb在此处,但不捕获结果
  • jpe?g— “jpg”或“jpeg”
  • png— 文字文本
  • \z— 字符串的结尾($只是行尾)
  • i— 使匹配不区分大小写(允许.JPG.jpg

但是,您也许可以摆脱这个(更具可读性)的版本:

allowed_extensions = %w[.jpg .jpeg .png]
if my_str.start_with?('http://') &&
   allowed_extensions.any?{ |ext| my_str.end_with?(ext) }
于 2012-07-13T21:42:37.130 回答
3

@Phrogz 的答案更好,我只是用一些 ruby​​ 库尝试过这个。

require 'uri'

extensions = %w( .jpg .jpeg .png )
schemes = %w( http https )
string = params[:url]

if (schemes.include?URI.parse(string).scheme) && (extensions.include?File.extname(string))

end
于 2012-07-14T08:36:47.043 回答
1

虽然正则表达式会缩短代码,但我宁愿不要在一个模式中进行这样的检查。这是一个自我记录/维护的事情。单个正则表达式更快,但如果所需的协议或图像类型增加,该模式将变得越来越笨拙。

这是我要做的:

str[%r{^http://}i] && str[/\.(?:jpe?g|png)$/]
于 2012-11-11T17:40:56.497 回答