2012-07-13 143 views
3

如果这是一个简单的问题,那么我对Ruby和Rails很感兴趣,所以请原谅我。我试图检查用户何时通过我的表单中的IMG网址,它是一个有效的网址。这里是我的代码:检查一个字符串是否包含'http://'和'.jpg'

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

返回并返回错误。这是甚至是最好的办法吗?我应该做什么不同?谢谢。

+2

听起来像是正则表达式的工作... [链接](http://www.tutorialspoint.com/ruby/ruby_regular_expressions.htm) – James 2012-07-13 21:41:31

回答

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

Regex的解释:

  • %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) } 
+0

完美。谢谢! – Deekor 2012-07-13 21:52:19

+0

@Deekor查看我编辑的答案更具可读性(如果不是很强大) – Phrogz 2012-07-13 21:52:42

+1

+1(我会在后缀前加一个'\ .') – 2012-07-13 21:52:46

3

@Phrogz回答是好,我只是试图与一些红宝石库。

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 
0

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

这里就是我想要做的:

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