2013-06-27 116 views
4

我試圖做一些基本的URL清洗,使簡單URL清潔

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

http://www.google.com(或https://www.google.com的情況下https://是開頭)所取代。

基本上我想檢查一下是否有http/https開頭,/最後在一個正則表達式中。

我是想這樣的事情:在這種情況下

"https://google.com".match(/^(http:\/\/|https:\/\/)(.*)(\/)*$/)我得到: => #<MatchData "https://google.com" 1:"https://" 2:"google.com" 3:nil> 這是很好的。

不幸的是:

"https://google.com/".match(/^(http:\/\/|https:\/\/)(.*)(\/)*$/)我得到: => #<MatchData "https://google.com/" 1:"https://" 2:"google.com/" 3:nil>,並希望有2:"google.com" 3:"/"

任何想法如何做到這一點?

+1

順便問一下,你是如何處理與多餘的空白最後瀏覽的網址? – Jerry

+0

好問題,謝謝。將工作。 –

回答

6

如果您發現該錯誤很明顯;)

你正在嘗試:

^(http:\/\/|https:\/\/)(.*)(\/)*$ 

的答案是使用:

^(http:\/\/|https:\/\/)(.*?)(\/)*$ 

這使得運營商 「非貪婪」 ,所以尾巴的正斜線不會被「。」吞噬。運營商。

編輯:

事實上,你應該使用:

^(http:\/\/|https:\/\/)?(www\.)?(.*?)(\/)*$ 

這樣,你也將匹配您的第一兩個例子,不具有「HTTP(S): //「 在他們中。您還在分解「www」部分的價值/存在。在行動:http://www.rubular.com/r/VUoIUqCzzX

EDIT2:

我很無聊,想要完善這個:P

在這裏你去:

^(https?:\/\/)?(?:www\.)?(.*?)\/?$ 

現在,所有你需要做的是更換您的網站與第一個匹配(或「http://」,如果爲零),然後是「www。」,然後是第二個匹配。

在行動:http://www.rubular.com/r/YLeO5cXcck

(18月以後)編輯:

看看我真棒紅寶石的寶石,這將有助於解決您的問題!

https://github.com/tom-lord/regexp-examples

/(https?:\/\/)?(?:www\.)?google\.com\/?/.examples # => 
    ["google.com", 
    "google.com/", 
    "www.google.com", 
    "www.google.com/", 
    "http://google.com", 
    "http://google.com/", 
    "http://www.google.com", 
    "http://www.google.com/", 
    "https://google.com", 
    "https://google.com/", 
    "https://www.google.com", 
    "https://www.google.com/"] 

/(https?:\/\/)?(?:www\.)?google\.com\/?/.examples.map(&:subgroups) # => 
    [[], 
    [], 
    [], 
    [], 
    ["http://"], 
    ["http://"], 
    ["http://"], 
    ["http://"], 
    ["https://"], 
    ["https://"], 
    ["https://"], 
    ["https://"]] 
+0

這正是我所期待的。謝謝。 –

+0

剛剛編輯我的答案,更好的版本:) –