如果這是一個簡單的問題,那麼我對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