2014-01-11 23 views
1

我有一個包含網站URL的數據庫。從這些網址我想提取域名。這裏有兩個(安靜不同)的例子:在Oracle SQL中從URL獲取域

http://www.example.com  -> example.com 
example.co.uk/dir/index.html -> example.co.uk 

爲了做到這一點,我使用正則表達式和功能REGEXP_SUBSTR和REGEXP_REPLACE甲骨文提供。我正在使用替換替換前面的http[s]www.用空字符串(刪除它)。然後,我使用子串來獲取開始和第一個/之間的字符串,或者如果沒有/整個字符串。我的代碼如下所示:

REGEXP_SUBSTR(REGEXP_REPLACE(website_url, '^http[s]?://(www\.)?|^www\.', '', 1), '(.+?)(/|$)') 

一切正常,只是我的正則表達式不能排除的事實/

example.com/dir/index.html -> example.com/ 

我想擺脫/的。我怎麼做?

回答

3

多虧我終於有工作了答案提示!

我現在使用的代碼看起來是這樣的:

REGEXP_REPLACE(website_url, '(http[s]?://)?(www\.)?(.*?)((/|:)(.)*|$)', '\3') 

感謝您的幫助大家!

+0

好工作,這幫了我 – Jared

4

使用此:

WITH tab AS 
(SELECT 'https://www.example.co.uk/dir/index.html' AS website_url 
    FROM dual) 
SELECT REGEXP_SUBSTR(REGEXP_REPLACE(website_url, '^http[s]?://(www\.)?|^www\.', '', 1), '\w+(\.\w+)+') 
    FROM tab; 

輸出:甲骨文

|REGEXP_SUBSTR(REGEXP_REPLACE(W| 
-------------------------------- 
|example.co.uk     | 
+0

這個作品非常好!非常感謝你。但遺憾的是,它不適用於包含'-'的URL,例如URl'www.top.i-am-a-example.com'給出了'top.i'我試過了,但我無法修復它。你知不知道怎麼? – Foaly

+0

增加允許的範圍可能是解決這個問題的一個辦法。 REGEXP_SUBSTR(REGEXP_REPLACE(website_url,'^ http [s]?// //(www \。)?|^www \。','',1),'[az,AZ,0-9, - ] +( \。\ w +)+')' – San

+0

是的,添加範圍似乎是唯一的選擇。使用你的代碼,我仍然會得到'top.i'。我不是正則表達式的專家,所以我不知道爲什麼......對我來說看起來是正確的 – Foaly

1

不知道是否支持?:排除一組或沒有。

REGEXP_REPLACE(website_url, '^(?:(?:http[s]?://)?www\.)?(.*?)(?:/.*|$)', '\1') 

如果沒有,那麼這一個:

REGEXP_REPLACE(website_url, '^((http[s]?://)?www\.)?(.*?)(/.*|$)', '\3') 
+0

據我所知,Oracle不支持'?:'第二個按預期工作,但不知何故它不起作用對於像這樣的網址:'www.example.com/dir/index.html'它返回:'example.comdir/index.html' – Foaly

0

你可以從字符串的結尾使用下面的正則表達式匹配something_without_a_dot.something_without_a_dot。你會在第一組中得到答案。如果您還需要頂級域名(TLD),除$之外,您可以在()中附上所有內容。

([^.]+)\.[^.]+$ 

在SQL中,給出了:

SQL> select regexp_replace('sub1.sub2.domain.com', '^.*?([^.]+)\.[^.]+$', '\1') from dual; 

REGEXP 
------ 
domain 

非貪婪.*?在一開始讓你忽略字符串的開始。

要獲得域名加上TLD:

SQL> select regexp_replace('sub1.sub2.domain.com', '^.*?([^.]+\.[^.]+)$', '\1') from dual; 

REGEXP_REP 
---------- 
domain.com 

要考慮到co.uk

SQL> select regexp_replace('sub1.sub2.domain.co.uk', '^.*?([^.]+\.(co\.uk|[^.]+))$', '\1') from dual; 

REGEXP_REPLA 
------------ 
domain.co.uk 

Source

0

爲什麼不使用(http)uritype並從中提取主機?