Mysql查询从URL中提取域

pep*_*one 18 mysql

对不起我的英语不好

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

SELECT SUBSTRING(LEFT(url, LOCATE('/', url, 8) - 1), 8) AS domain...
Run Code Online (Sandbox Code Playgroud)

它只适用于网址www.google.com/something

它不适用于网址

www.google.it(不带斜线)

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

你知道怎么解决吗?

Los*_*311 34

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

SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(target_url, '/', 3), '://', -1), '/', 1), '?', 1) AS domain
Run Code Online (Sandbox Code Playgroud)

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

SUBSTRING_INDEX(target_url, '/', 3)- 如果url有
SUBSTRING_INDEX(THAT, '://', -1)协议,则
SUBSTRING_INDEX(THAT, '/', 1)剥离任何路径 - 从THAT剥离任何协议 - 从THAT 剥离任何路径(如果没有协议)
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; 
Run Code Online (Sandbox Code Playgroud)

结果:

'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'
Run Code Online (Sandbox Code Playgroud)

  • 只是一个小问题。我们有像“//test.com/test.html”这样的网址,但它不适用于这些网址。使用“//”而不是“://”使其工作。 (2认同)
  • 如何仅获取主域,不想包含子域,就像答案中的示例一样,所有结果行应该是“test.com” (2认同)

evi*_*e84 16

删除www.,anysubdomain以及/之后的所有内容:

SUBSTRING_INDEX((SUBSTRING_INDEX((SUBSTRING_INDEX(url, 'http://', -1)), '/', 1)), '.', -2) as domain
Run Code Online (Sandbox Code Playgroud)

  • 抱歉,这个不适用于带有双点的域名,例如api.site.com (3认同)
  • 使用这个,在我将“http://”更改为“://”允许 https 后工作正常。 (2认同)
  • 当您在字段中同时具有http和https时,可以使用`CASE WHEN SUBSTRING(url,1,5)='https'THEN SUBSTRING_INDEX((SUBSTRING_INDEX((SUBSTRING_INDEX(url,'https://',-1 )),'/',1)),'。',-2)其他SUBSTRING_INDEX((SUBSTRING_INDEX(((SUBSTRING_INDEX(url,'http://',-1)),'/',1)),' 。',-2)END` (2认同)

bik*_* kc 7

如果你想删除 www. 连同来自您域的 http://、https:// 和 /(path),请执行以下操作:

SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(document_url, '/', 3), '://', -1), '/', 1), '?', 1),'www.',-1)
Run Code Online (Sandbox Code Playgroud)


JYe*_*ton 2

如果你想找到第一次出现的情况,/为什么你要传递 8LOCATE作为起始位置?(我假设在协议后面跳过斜杠,例如 http://,但如果您也希望 url 没有协议,请考虑使用 cnn.com/page 等短斜杠)

IF(LOCATE('/', url) > 0, SUBSTRING(url, 1, LOCATE('/', url) - 1), url) AS domain
Run Code Online (Sandbox Code Playgroud)

或者:

SUBSTRING_INDEX(url, '/', 1) AS domain
Run Code Online (Sandbox Code Playgroud)

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