我们如何使用MySQL和正则表达式找到域名

时间:2010-08-19 11:06:10

标签: mysql

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

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

我需要的东西是

http://www.masn.com
http://www.123musiq.com

我怎么能在正则表达式中做到这一点?

6 个答案:

答案 0 :(得分:9)

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

您可以使用SUBSTRING_INDEX

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

答案 1 :(得分:4)

使用substring_index

http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_substring-index

SELECT  SUBSTRING_INDEX(urlfield, '/', 1) from mytable

答案 2 :(得分:1)

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('http://www.domain.com/','://', - 1),'/',1);

结果: www.domain.com

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX('http://www.domain.com/','://', - 1),'/',1),'www。', - 1);

结果: domain.com

答案 3 :(得分:0)

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

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,但应处理大多数正确的URL。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

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

这对我有用并保留了 https:// 和 http://,因为我需要 URL 方案是正确的。