提问人:Foaly 提问时间:1/11/2014 更新时间:5/8/2019 访问量:11288
在 Oracle SQL 中从 URL 获取域
Get domain from URL in Oracle SQL
问:
我有一个包含网站 URL 的数据库。我想从这些URL中提取域名。这里有两个(安静不同的)例子:
http://www.example.com -> example.com
example.co.uk/dir/index.html -> example.co.uk
为此,我使用了正则表达式以及 Oracle 提供的函数 REGEXP_SUBSTR 和 REGEXP_REPLACE。我正在使用 replace 替换前面的内容,并用空字符串替换(删除它)。然后,我使用子字符串来获取开头和第一个字符串之间的字符串,或者如果没有整个字符串。我的代码如下所示:http[s]
www.
/
/
REGEXP_SUBSTR(REGEXP_REPLACE(website_url, '^http[s]?://(www\.)?|^www\.', '', 1), '(.+?)(/|$)')
一切都按预期工作,除了我的正则表达式未能排除:/
example.com/dir/index.html -> example.com/
我想摆脱 .我该怎么做?/
答:
7赞
San
1/12/2014
#1
使用这个:
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赞
Foaly
1/12/2014
这效果很好!谢谢。但可悲的是,它不适用于包含例如我尝试过的 URl 给出的 URL,但我无法修复它。你知道怎么做吗?-
www.top.i-am-a-example.com
top.i
0赞
San
1/12/2014
增加允许的范围可能是解决这个问题的一种解决方案。REGEXP_SUBSTR(REGEXP_REPLACE(website_url, '^http[s]?://(www\.)?|^www\.', '', 1), '[a-z,A-Z,0-9,-]+(\.\w+)+')
0赞
Foaly
1/12/2014
是的,添加范围似乎是唯一的选择。使用你的代码我仍然得到.我不是正则表达式专家,所以我不知道为什么......对我来说看起来是正确的top.i
1赞
Sabuj Hassan
1/12/2014
#2
不确定 oracle 是否支持排除组。?:
REGEXP_REPLACE(website_url, '^(?:(?:http[s]?://)?www\.)?(.*?)(?:/.*|$)', '\1')
如果没有,那么这个:
REGEXP_REPLACE(website_url, '^((http[s]?://)?www\.)?(.*?)(/.*|$)', '\3')
评论
0赞
Foaly
1/12/2014
据我所知,Oracle 不支持预期的第二种工作,但不知何故它不适用于以下网址: 它返回:?:
www.example.com/dir/index.html
example.comdir/index.html
0赞
Vignesh Kumar A
1/12/2014
#3
您可以使用以下正则表达式匹配字符串末尾的 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
5赞
Foaly
1/12/2014
#4
多亏了答案中的提示,我终于让它工作了!
我现在使用的代码如下所示:
REGEXP_REPLACE(website_url, '(http[s]?://)?(www\.)?(.*?)((/|:)(.)*|$)', '\3')
感谢大家的帮助!
0赞
Tala
5/24/2016
#5
为什么不使用 (http)uritype 并从中提取主机?
评论