我是 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)$/]