如何使用MySQL和正则表达式查找域名

如何使用MySQL和正则表达式查找域名,mysql,Mysql,我在数据库中有一些域列表,如 http://www.masn.com/index.html http://www.123musiq.com/index.htmletc 我需要的是 http://www.masn.com http://www.123musiq.com 如何在正则表达式中实现这一点???在MySQL中,正则表达式可以匹配,但不能返回子字符串 您可以使用子字符串索引: SELECT SUBSTRING_INDEX('www.example.com', '/', 1) 但是,它不是

我在数据库中有一些域列表,如

http://www.masn.com/index.html

http://www.123musiq.com/index.html
etc

我需要的是

http://www.masn.com

http://www.123musiq.com


如何在正则表达式中实现这一点???

MySQL
中,正则表达式可以匹配,但不能返回子字符串

您可以使用子字符串索引:

SELECT  SUBSTRING_INDEX('www.example.com', '/', 1)
但是,它不是协议前缀安全的

如果您混合使用带前缀和不带前缀的
URL
,请使用以下选项:

SELECT  url RLIKE '^http://',
        CASE
        WHEN url RLIKE '^http://' THEN
                SUBSTRING_INDEX(SUBSTRING_INDEX(url, '/', 3), '/', -1)
        ELSE
                SUBSTRING_INDEX(url, '/', 1)
        END
FROM    (
        SELECT   'www.example.com/test/test' AS url
        UNION ALL
        SELECT   'http://www.example.com/test'
        ) q

使用子字符串索引


基于这些答案,我提出了一个类似的解决方案,但它需要多个查询

SELECT SUBSTRING_INDEX(url,'/',1) FROM table WHERE url NOT REGEXP '^[^:]+://';
SELECT SUBSTRING_INDEX(url,'/',3) FROM table WHERE url REGEXP '^[^:]+://';
第一个查询处理没有协议前缀的URL。第二个查询处理带有协议前缀的URL。请注意,它们不能处理所有有效的URL,但应该处理最正确的URL。

选择子字符串索引(子字符串索引(“”,:/“”,-1),“/”,1)

结果:www.domain.com

选择子字符串索引(子字符串索引(子字符串索引(“,”:/“,-1),“/”,1),“www.”,-1)


结果:domain.com

如果你不怕安装MySQL扩展(UDF),那么有一个UDF可以做到这一点,同时尊重不同的顶级域名,如“google.com”和“google.co.uk”,并处理大量其他边缘案例


我也遇到了类似的问题,但有些数据的查询参数没有斜杠

SUBSTRING_INDEX(SUBSTRING_INDEX(urlfield, '/', 3) , '?', 1)

这对我来说很有效,并且保持了https://和http://因为我需要正确的URL方案。

@Alex:正如我在回答中所说的,它不是协议前缀安全的。
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
SUBSTRING_INDEX(SUBSTRING_INDEX(urlfield, '/', 3) , '?', 1)