2011-02-27 96 views
11

可能重複:
Ruby code to extract host from URL string解析URL以提取域的最佳方式是什麼?

我發現這個模塊調用URI可以解析URL。 (我對ruby很新,在這種情況下'module'是否與'library'同義?)然後你可以提取主機名。

uri = URI.parse("http://www.ruby-lang.org/") 
... 
p uri.host 
# => "www.ruby-lang.org" 

從這個,我想你可以刪除'www。'並使用正則表達式保留其他子域。

有沒有人有更直接的選擇,或者這種方法看起來是對的嗎?

+0

當然,ruby必須具有某種'split()'功能。那麼你爲什麼不把這個字符串拆分成'www.'',然後保留部分呢? – Anders 2011-02-27 13:08:21

+0

你究竟想要什麼?只需從'uri.host'中刪除'www'? – 2011-02-27 13:25:17

+0

庫通常是一個獨立的代碼資源,可以包含一個或多個模塊或類。 ''URI'是Ruby核心庫中的一個模塊,這意味着它可以在你運行的任何ruby代碼中使用。對於所有其他代碼,您必須將其明確加載到您的應用程序中 – Gareth 2011-02-27 13:32:53

回答

4

你可以使用domainatrix gem來得到你想要的:url.domain + url.public_suffix,但你可以做一些字符串操作,如uri[4..-1]

+0

這顆寶石很不錯。我想我可以顯示子域名!'='www''。 – 2011-02-27 22:21:31

7

因此,當發佈我自己的答案時,我並不是說像domainatrix或public_suffix_server這樣的寶石不是優雅的解決方案(儘管後者立即竊聽我,導致我走這條路)。

建議使用split()的人讓我意識到我可以將「www」分出來。如果它存在否則離開域,因爲它們無需安裝寶石和使用的代碼1個簡單行:

url = request.original_url 
domain = URI.parse(url).host.sub(/\Awww\./, '') 

這適用於子域和多部分後綴(如co.uk)。有人看到有什麼不對嗎?

編輯:感謝sorens指出我正在使用的弱正則表達式。這個表達肯定更好。

+4

你應該收緊你的正則表達式。 'www.''要匹配任何是'www'和任何其他字符的字符串。該時期是一個特殊的正則表達式字符,意味着任何單個字符。所以如果你在網站http://www2009.org/上進行測試,你最終會刪除「www2」,並留下009.org。至少,請嘗試'\ Awww \',「\ A」將強制檢查僅在字符串開頭和「\」處考慮它。將會擺脫這個時期,意味着你只是在尋找時期的角色。如果您在使用正則表達式時遇到問題,那麼http://www.rubular.com/是一個很好的幫助。 – sorens 2011-02-28 00:35:43

相關問題