我是 Ruby 和 Rails 的新手,如果这是一个简单的问题,请原谅我。我试图检查用户何时在我的表单中传入 IMG url,它是一个有效的 url。这是我的代码:
if params[:url].include? 'http://' && (params[:url].include? '.jpg' || params[:url].include? '.png')
这返回和错误。这甚至是最好的方法吗?我应该怎么做?谢谢。
我是 Ruby 和 Rails 的新手,如果这是一个简单的问题,请原谅我。我试图检查用户何时在我的表单中传入 IMG url,它是一个有效的 url。这是我的代码:
if params[:url].include? 'http://' && (params[:url].include? '.jpg' || params[:url].include? '.png')
这返回和错误。这甚至是最好的方法吗?我应该怎么做?谢谢。
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) }
@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
虽然正则表达式会缩短代码,但我宁愿不要在一个模式中进行这样的检查。这是一个自我记录/维护的事情。单个正则表达式更快,但如果所需的协议或图像类型增加,该模式将变得越来越笨拙。
这是我要做的:
str[%r{^http://}i] && str[/\.(?:jpe?g|png)$/]