2012-07-13 144 views
3

如果這是一個簡單的問題,那麼我對Ruby和Rails很感興趣,所以請原諒我。我試圖檢查用戶何時通過我的表單中的IMG網址,它是一個有效的網址。這裏是我的代碼:檢查一個字符串是否包含'http://'和'.jpg'

if params[:url].include? 'http://' && (params[:url].include? '.jpg' || params[:url].include? '.png') 

返回並返回錯誤。這是甚至是最好的辦法嗎?我應該做什麼不同?謝謝。

+2

聽起來像是正則表達式的工作... [鏈接](http://www.tutorialspoint.com/ruby/ruby_regular_expressions.htm) – James 2012-07-13 21:41:31

回答

15
if my_str =~ %r{\Ahttps?://.+\.(?:jpe?g|png)\z}i 

Regex的解釋:

  • %r{...} —正則表達式字面類似於/.../,但允許/被內部使用,而不脫離
  • \A —字符串的開始(^是剛開始該行)
  • http —字面文字
  • s? —任選隨後進行一個 「s」(允許的https://)
  • :// —的文字文本(以防止像http-whee.jpg
  • .+ —一個或多個字符(即不是新行)
  • \. —文字句點(確保這是我們正在尋找的延伸)
  • (?:aaa|bbb) —允許任何aaabbb在這裏,但不捕獲結果
  • 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) } 
+0

完美。謝謝! – Deekor 2012-07-13 21:52:19

+0

@Deekor查看我編輯的答案更具可讀性(如果不是很強大) – Phrogz 2012-07-13 21:52:42

+1

+1(我會在後綴前加一個'\ .') – 2012-07-13 21:52:46

3

@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 
0

雖然正則表達式會縮短代碼,但我寧願不要在一種模式中進行這樣的檢查。這是一個自我記錄/維護的事情。單一的正則表達式速度更快,但如果所需的協議或圖像類型增長,這種模式將變得越來越笨拙。

這裏就是我想要做的:

str[%r{^http://}i] && str[/\.(?:jpe?g|png)$/] 
相關問題