我在数据库中有一些域列表,比如
http://www.masn.com/index.html
http://www.123musiq.com/index.html
等
我需要的东西是
http://www.masn.com
http://www.123musiq.com
我怎么能在正则表达式中做到这一点?
答案 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 方案是正确的。