如果这是一个简单的问题,那么我对Ruby和Rails很感兴趣,所以请原谅我。我试图检查用户何时通过我的表单中的IMG网址,它是一个有效的网址。这里是我的代码:检查一个字符串是否包含'http://'和'.jpg'
if params[:url].include? 'http://' && (params[:url].include? '.jpg' || params[:url].include? '.png')
返回并返回错误。这是甚至是最好的办法吗?我应该做什么不同?谢谢。
如果这是一个简单的问题,那么我对Ruby和Rails很感兴趣,所以请原谅我。我试图检查用户何时通过我的表单中的IMG网址,它是一个有效的网址。这里是我的代码:检查一个字符串是否包含'http://'和'.jpg'
if params[:url].include? 'http://' && (params[:url].include? '.jpg' || params[:url].include? '.png')
返回并返回错误。这是甚至是最好的办法吗?我应该做什么不同?谢谢。
if my_str =~ %r{\Ahttps?://.+\.(?:jpe?g|png)\z}i
Regex的解释:
%r{...}
—正则表达式字面类似于/.../
,但允许/
被内部使用,而不脱离\A
—字符串的开始(^
是刚开始该行)http
—字面文字s?
—任选随后进行一个 “s”(允许的https://)://
—的文字文本(以防止像http-whee.jpg
).+
—一个或多个字符(即不是新行)\.
—文字句点(确保这是我们正在寻找的延伸)(?:aaa|bbb)
—允许任何aaa
或bbb
在这里,但不捕获结果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) }
@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
虽然正则表达式会缩短代码,但我宁愿不要在一种模式中进行这样的检查。这是一个自我记录/维护的事情。单一的正则表达式速度更快,但如果所需的协议或图像类型增长,这种模式将变得越来越笨拙。
这里就是我想要做的:
str[%r{^http://}i] && str[/\.(?:jpe?g|png)$/]
听起来像是正则表达式的工作... [链接](http://www.tutorialspoint.com/ruby/ruby_regular_expressions.htm) – James 2012-07-13 21:41:31