2016-01-01 89 views
3

我有網址模式已網址列,我想驗證該列是一個有效的URL,我已經嘗試用這樣的:如何驗證rails模型中的url?

class User < ActiveRecord::Base 
    validates_format_of :url, :with => URI::regexp(%w(http https)) 
end 

但是,當我進入這個網址:http://ruby3arabi它接受它,任何想法?

+2

此問題在此深入討論http://stackoverflow.com/questions/7167895/whats-a-good-way-to-validate-links-urls-in-rails – Semjon

+0

可能的重複[Rails:什麼是好的驗證鏈接(URL)的方法?](https://stackoverflow.com/questions/7167895/rails-whats-a-good-way-to-validate-links-urls) –

回答

7

我測試,發現URI ::正則表達式(%W(HTTP HTTPS))URI :: regexp不夠好。

的故障排除使用正則表達式

/^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix 

選項:

  • 我 - 不區分大小寫
  • X - 忽略正則表達式

所以空白,如果你想在模型中驗證,您應該使用此代替:

class User < ActiveRecord::Base 
    URL_REGEXP = /^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix 
    validates :url, format: { with: URL_REGEXP, message: 'You provided invalid URL' } 
end 

測試:

  • [1] URI ::正則表達式(%(重量)(HTTP HTTPS))

    測試與錯誤網址:

    • http:/ / ruby​​3arabi - 結果是無效的
    • HTTP:/ / HTTP:/ / ruby​​3arabi.com - 結果是無效的
    • HTTP:/ / - 結果是無效的

    測試與正確的URL:

    • http:/ / ruby​​3arabi.com - 結果是無效的
    • HTTP:/ / www.ruby3arabi.com - 結果是無效的
    • 的https:/ / www.ruby3arabi.com - 結果是無效的
    • 的https:/ / WWW。 ruby3arabi。COM /條/ 1 - 結果是無效的
    • HTTPS:/ / www.ruby3arabi.com/websites/58e212ff6d275e4bf9000000?locale=en - 結果是無效的

  • [2] URI: :正則表達式

    測試與錯誤網址:

    • HTTP:/ / ruby​​3arabi - 結果是有效的
    • HTTP:/ / HTTP:/ / ruby​​3arabi.com - 結果是有效的
    • HTTP:/ / - 結果是有效的

    用正確的網址進行測試:

    • HTTP:/ / ruby​​3arabi.com - 結果是有效的
    • HTTP:/ / www.ruby3arabi.com - 結果是有效的
    • 的https:/ / www.ruby3arabi.com - 結果是有效的
    • https:/ / www.ruby3arabi.com/article/1 - 結果有效
    • https:/ / www.ruby3arabi.com/websit ?ES/58e212ff6d275e4bf9000000語言環境=烯 - 結果是有效

  • [3]/^(HTTP | HTTPS):// [A-Z0-9] +([ - ] { 1} [a-z0-9] +)。[az] {2,5}(:[0-9] {1,5})?(/。 ?)$/IX

    測試與錯誤網址:

    • HTTP:/ / ruby​​3arabi - 結果是無效的
    • HTTP:/ / HTTP:/ / ruby​​3arabi。COM - 結果是無效的
    • HTTP:/ / - 結果是無效的

    測試與正確的URL:

    • HTTP:/ / ruby​​3arabi.com - 結果是有效的
    • http:/ / www.ruby3arabi.com - result is vali d
    • 的https:/ / www.ruby3arabi.com - 結果是有效的
    • 的https:/ / www.ruby3arabi.com/article/1 - 結果是有效的
    • 的https:/ / www.ruby3arabi.com/網站/ 58e212ff6d275e4bf9000000區域= EN - ?結果是有效的

+0

我會說這是完美的正則表達式我一直尋找。 –

+1

以上正則表達式在rails 4中拋出一個參數錯誤(多行表達式的安全問題)。備用方法是使用\ A作爲字符串的開始,\ z作爲結束。 –