检查字符串是否包含'http://'和'.jpg'

时间:2012-07-13 21:32:16

标签: ruby ruby-on-rails-3

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

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

返回错误。这甚至是最好的方式吗?我该怎么办?感谢。

3 个答案:

答案 0 :(得分: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) }

答案 1 :(得分:3)

@Phrogz答案更好,我只是尝试了一些ruby libs。

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

答案 2 :(得分:0)

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

这就是我要做的事情:

str[%r{^http://}i] && str[/\.(?:jpe?g|png)$/]