2014-05-09 85 views
2

我如何可以驗證文本列,它不包含網站的例子可以是:後端驗證軌道

www.google.com 
google.com 
http://gooogle.com 
http://www.google.com 
https://www.google.com 
https://google.com 

我想這樣做在正面,但在後端爲好。我更感興趣的是,此刻的後端,我會處理的前端之後

問題更新:

基於例如通過MrYoshiji提供的,我已經想出情況下是不包括:

http://rubular.com/r/VGgWyfIt7R

看到文本中間的http://www.google.com?它不匹配?這正是我需要它匹配的。所以我可以拋出驗證錯誤,說你不能把網站。

+1

你最終的目標是什麼? – DickieBoy

+0

@DickieBoy我不想讓人們在我正在驗證的文本框中粘貼網站 –

回答

2

我找到了一個強有力的正則表達式,學分轉到@PhillPafford(PHP RegEx for "Website Name"如果您給予好評我的回答,請給予好評他的第一次!):

/^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)[email protected])?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?$/ 

要看到它在行動:

http://rubular.com/r/GOHHrucCdX


UPDATE:

這人會在文本的任何地方看到的姓名:

/(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)[email protected])?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?/ 

請注意,我刪除了^在開始和$末,使之成爲文本內工作:

Rubular來源:

^行首

線$結束

http://rubular.com/r/iEVzfv2U3O


@GandalfStormCrow注意到以下匹配:

Since I was little.My first dog 
       #^^^ 

我看到解決這個問題的唯一辦法是更換little.Mylittle. My

text.gsub(/\w\.[A-Z]/) { |matched_string| matched_string.gsub('.', '. ') } 

看到它在行動:

1.9.3p489 :018 > text = "hello my name is robert.My dog" 
=> "hello my name is robert.My dog" 
1.9.3p489 :019 > text.gsub(/\w\.[A-Z]/) { |matched_string| matched_string.gsub('.', '. ') } 
=> "hello my name is robert. My dog" 
+0

它適用於域名匹配,但是當我將google.com放在文本中間時。它不匹配,這就是我正在尋找,請看這個http://rubular.com/r/VGgWyfIt7R –

+0

這個正則表達式讓「google.com」通過。 (反引號不用在他們的空間中工作) – DickieBoy

+0

這很明顯就是爲什麼你在測試之前調用'.strip' ......你不希望用戶在之前保存任何有1個或更多空格的輸入,你? – MrYoshiji

0

在模型中添加:

validates_format_of :your_column, without: /\A((http(s)?:)?\/\/(www)?.)?(www.)?[a-zA-Z]*.com\z/ 

Here's where I crafted the Regex

+1

在問題的各行之間進行閱讀。 google.co.uk怎麼樣? – DickieBoy

+0

'google.fr'呢?想想法國,神的話:P – MrYoshiji

+0

帶數字的域名呢? – MrYoshiji

-1

我看到許多人採取的正則表達式的方法來此,但馬你想創建一個簡單的黑名單。喜歡的東西:

class MyModel < ActiveRecord::Base 
    BLACKLIST = [ 
    'google.com' 
    ] 

    validate :disallow_blacklisted_urls 

    private 
    def disallow_blacklisted_urls 
    BLACKLIST.each do |blacklisted_url| 
     if my_field && my_field.include?(blacklisted_url) 
     errors.add(:my_field, "must not contain #{blacklisted_url}") 
     end 
    end 
    end 
end 

的原因我會走這條路是你可以輕鬆地一年沒有看到後,添加更多的網址(facebook.com,twitter.com),它仍然會工作,並明確代碼,而正則表達式對於我衰老的眼睛(和大腦:-))來說太神祕了。此外,如果您不想每次都檢查整個黑名單,則可以在驗證方法的核心條件中添加一箇中斷,但我認爲用戶會有這樣的更好的反饋。