我是Ruby和Rails的新手,请原谅我,如果这是一个简单的问题。我试图检查用户何时在我的表单中传入IMG网址,这是一个有效的网址。这是我的代码:
if params[:url].include? 'http://' && (params[:url].include? '.jpg' || params[:url].include? '.png')
返回错误。这甚至是最好的方式吗?我该怎么办?感谢。
答案 0 :(得分:15)
if my_str =~ %r{\Ahttps?://.+\.(?:jpe?g|png)\z}i
正则表达式解释说:
%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) }
答案 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)$/]