Mysql查询从URL中提取域

时间:2012-02-14 16:18:52

标签: mysql

抱歉我的英文

我有这个查询从网址中提取域名

SELECT SUBSTRING(LEFT(url, LOCATE('/', url, 8) - 1), 8) AS domain...

仅当网址类似于www.google.com/something

时才有效

它不适用于像

这样的网址

www.google.it(不带斜线)

www.google.it/abc/xzy/(永久链接)

你知道怎么解决吗?

12 个答案:

答案 0 :(得分:29)

我必须结合以前的一些答案,再加上我的数据集更多的hackery。这对我有用,它返回域和任何子域:

SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(target_url, '/', 3), '://', -1), '/', 1), '?', 1) AS domain

解释(导致非平凡的SQL很少有意义):

SUBSTRING_INDEX(target_url, '/', 3) - 如果网址具有协议,则删除任何路径 SUBSTRING_INDEX(THAT, '://', -1) - 剥离任何协议 SUBSTRING_INDEX(THAT, '/', 1) - 从那里剥离任何路径(如果没有协议)
SUBSTRING_INDEX(THAT, '?', 1) - 从THAT中剥离查询字符串(如果没有路径或尾随/)

测试案例:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(target_url, '/', 3), '://', -1), '/', 1), '?', 1) AS domain
FROM ( 
    SELECT       'http://test.com' as target_url 
    UNION SELECT 'https://test.com' 
    UNION SELECT 'http://test.com/one' 
    UNION SELECT 'http://test.com/?huh' 
    UNION SELECT 'http://test.com?http://ouch.foo' 
    UNION SELECT 'test.com' 
    UNION SELECT 'test.com/one'
    UNION SELECT 'test.com/one/two'
    UNION SELECT 'test.com/one/two/three'
    UNION SELECT 'test.com/one/two/three?u=http://maaaaannn'
    UNION SELECT 'http://one.test.com'
    UNION SELECT 'one.test.com/one'
    UNION SELECT 'two.one.test.com/one' ) AS Test; 

结果:

'test.com'
'test.com'
'test.com'
'test.com'
'test.com'
'test.com'
'test.com'
'test.com'
'test.com'
'test.com'
'one.test.com'
'one.test.com'
'two.one.test.com'

答案 1 :(得分:16)

删除www。,anysubdomain以及/:

之后的所有内容
SUBSTRING_INDEX((SUBSTRING_INDEX((SUBSTRING_INDEX(url, 'http://', -1)), '/', 1)), '.', -2) as domain

答案 2 :(得分:4)

所有答案似乎对我都不起作用。例如,一个用?启动变量的url?没有得到一些答案。这适用于所有类型的URL:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(REPLACE(LOWER(url), 'https://', ''), 'http://', ''), '/', 1), '?', 1) AS domain;

答案 3 :(得分:2)

如果您想找到/的第一个匹配项,为什么要将8作为起始位置传递给LOCATE? (我假设在协议之后跳过斜杠,例如http://但是如果你还期望没有协议的url,请考虑像cnn.com/page这样的短协议)

IF(LOCATE('/', url) > 0, SUBSTRING(url, 1, LOCATE('/', url) - 1), url) AS domain

可替换地:

SUBSTRING_INDEX(url, '/', 1) AS domain

后者对我来说似乎更容易。

答案 4 :(得分:2)

如果您要删除www。以及来自您网域的http://,https://和/(路径)请执行以下操作:

SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(document_url, '/', 3), '://', -1), '/', 1), '?', 1),'www.',-1)

答案 5 :(得分:1)

这个很好用于我非常混乱的数据:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(url, '//', '.'), '/', 1), '.', -2) AS Domain

答案 6 :(得分:0)

查询需要考虑不跟踪' /'

IF( LOCATE('/', replace(url,'http://', '') ) > 0 , SUBSTRING(replace(url,'http://', ''), 1, LOCATE('/', replace(url,'http://', '') ) - 1), replace(url,'http://', '')) AS domain

答案 7 :(得分:0)

最好使用它,因为它也会像“www.google.co.in”那样捕获网址

SELECT replace((replace((SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(url, '//', ''), '/', 1), '*', -2)), 'http:','')),'https:','') AS Domain

答案 8 :(得分:0)

如果您不担心安装MySQL扩展(UDF),那么可以使用一个UDF做到这一点,同时尊重“ google.com”和“ google.co.uk”等不同的顶级域。< / p>

https://github.com/StirlingMarketingGroup/mysql-get-etld-p1

select`get_etld_p1`('http://a.very.complex-domain.co.uk:8080/foo/bar');-- 'complex-domain.co.uk'
select`get_etld_p1`('https://www.bbc.co.uk/');-- 'bbc.co.uk'
select`get_etld_p1`('https://github.com/StirlingMarketingGroup/');-- 'github.com'
select`get_etld_p1`('https://localhost:10000/index');-- 'localhost'
select`get_etld_p1`('android-app://com.google.android.gm');-- 'com.google.android.gm'
select`get_etld_p1`('example.test.domain.com');-- 'domain.com'
select`get_etld_p1`('postgres://user:pass@host.com:5432/path?k=v#f');-- 'host.com'
select`get_etld_p1`('exzvk.omsk.so-ups.ru');-- 'so-ups.ru'
select`get_etld_p1`('http://10.64.3.5/data_check/index.php?r=index/rawdatacheck');-- '10.64.3.5'
select`get_etld_p1`('not a domain');-- null

答案 9 :(得分:0)

对于我来说,这很好:

SELECT SUBSTRING_INDEX(REPLACE(SUBSTRING_INDEX(url,'//',-1),'www.',''),'/',1) AS DOMAIN;

答案 10 :(得分:0)

我在本页(和一些文档)docs上尝试了多个示例,以制作以下带注释的版本。 SUBSTRING_INDEX似乎无法在不删除* .co.uk类型的域的情况下删除子域。

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(url, 
'?', 1), # split on url params to remove weirdest stuff first 
'://', -1), # remove protocal http:// https:// ftp:// ...
'/', 1), # split on path 
':', 2), # split on user:pass
'@', 1), # split on user:port@
':', 1), # split on port
'www.', -1), # remove www.
'.', 4), # keep TLD + domain name
'/', 1) 
AS domain
FROM ( 
    SELECT       'http://test.com' as url 
    UNION SELECT 'https://test.com' 
    UNION SELECT 'http://test.com/one' 
    UNION SELECT 'http://test.com/?huh' 
    UNION SELECT 'http://www.test1.test.com?http://ouch.foo' 
    UNION SELECT 'test.com' 
    UNION SELECT 'test.com/one'
    UNION SELECT 'test.com/one/two'
    UNION SELECT 'test.com/one/two/three'
    UNION SELECT 'test.com/one/two/three?u=http://maaaaannn'
    UNION SELECT 'http://one.test.com'
    UNION SELECT 'one.test.com/one'
    UNION SELECT 'https://www.bbc.co.uk/'
    UNION SELECT 'http://a.very.complex-domain.co.uk:8080/foo/bar'
    UNION SELECT 'postgres://user:pass@host.com:5432/path?k=v#f'
    UNION SELECT 'http://10.64.3.5/data_check/index.php?r=index/rawdatacheck'
    UNION SELECT 'two.one.test.com/one' ) AS test; 

答案 11 :(得分:0)

SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(website, '/', 3), '://', -1), '/', 1), '?', 1),'www.',-1)

删除 http:// https:// www.

以及它们的组合。

留下 domian.com 和 sub.domian.com 组合。