2009-09-19 42 views
1

有一個表單域,其中用戶應該以「google.com」的形式輸入域名。如何從雜亂的用戶輸入中匹配/提取域名?

然而,考慮到用戶的困惑,我希望能夠清潔輸入的「google.com」的確切形式的情況下,他們在下列情況下鍵入:

http://www.google.com 
http://google.com 
google.com/blah 
www.google.com 
..and other incorrect forms 

什麼最好的方法來完成這個?

在此先感謝!

回答

4

您可以編寫簡單的函數,用正則表達式清理這些了:

def foo(s) 
    s.gsub(/^(http:\/\/)?(www\.)?/,'').gsub(/\/.*$/,'') 
    end 

這適用於你給的所有例子。如果這還不夠,增加更多的測試用例:

def test_foo 
    assert_equal 'google.com', foo('http://www.google.com') 
    assert_equal 'google.com', foo('http://google.com') 
    assert_equal 'google.com', foo('google.com/blah') 
    assert_equal 'google.com', foo('www.google.com') 
    end 
0

這很難。您不僅需要解析許多不同形式的URI,還需要知道如何使用諸如Public Suffix List之類的東西來獲取主機名中的TLD,就像Firefox一樣。

6

你應該建立自己的系統在addressable/uri,這種寶石會照顧的URI的東西(路徑,主機,端口),你只需要提供默認方案是http。 (​​)。

>> uri = Addressable::URI.parse("http://google.com?q=lolcat") 
=> #<Addressable::URI:0x80bcf0e0 URI:http://google.com?q=lolcat> 
>> [uri.host,uri.path,uri.scheme] 
=> ["google.com", "", "http"] 

基本上你只是來檢測,如果HTTP://存在並添加它,如果它不是這種情況,因爲URI不會猜到它。而且完成了,無需手動處理。

+0

這是一個非常有趣和靈活的解決方案。謝謝。 – jimsung