2009-02-06 19 views
0

我正在從我的網址中解壓主機,並且由於最後/可選而陷入了僵局。 正則表達式需要準備接收下列內容:什麼是最好的方式來提取正則表達式的網址的主機部分?

http://a.b.com:8080/some/path/file.txt 
or 
ftp://a.b.com:8080/some/path 
or 
ftp://[email protected]/some/path 
or 
http://a.b.com 
or 
a.b.com/some/path 

and return a.b.com 

所以......

(ftp://|http://)? optionally matches the first part 
then it gets hairy... 
so... without adding ugly (and wrong) regexp here... just in english 
(everything that isn't an '@') //optional 
(everything that isn't a '/' up to the first '/' IF it's there) //this is the host group that I want 
(everything else that trails) //optional 

回答

2

傑里米流轉的的答案是接近,但如果@主機名之後出現在任何地方都將失敗。我建議:

(一切,這是不是一個 '@')//可選

(?:[^ @:/ * @)?

如果在域後出現@,冒號和斜槓將阻止匹配通過域。請注意非捕獲的parens。

(一切,是不是 '/' 到第一個 '/',如果它的存在) //這是主機組,我想

([^:/] +)

請注意捕獲的parens。

(其他一切落後)//可選

由於括號捕獲的主機名和唯一的主機名,就沒有必要繼續匹配。

所以,把他們放在一起,你得到:

/^(?:?FTP | HTTPS)://(?:[^ @:/ * @)([^:/] + )/

(請注意,前兩個paren分組是非捕獲 - 希望您的正則表達式庫支持。)

5

你需要使用正則表達式?大多數語言都支持解析URL。例如,Java有它的java.net.URL,Python有它的urlparse模塊,Ruby有它的URI模塊。您可以使用它們來查詢給定URL的不同部分。

0

我在PHP測試這一點,它適用於所有的例子:

/^(ftp:\/\/|https?:\/\/)?([email protected])?([a-zA-Z0-9\.\-]+).*$/