Подтвердить что ты не робот

Запрос Mysql для извлечения доменов из URL-адресов

извините за мой английский

У меня есть этот запрос для извлечения домена из URL-адресов

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

он работает только тогда, когда URL-адрес похож на www.google.com/something

он не работает с такими URL-адресами, как

www.google.it(без конечной косой черты)

www.google.it/abc/xzy/(постоянная ссылка)

Вы знаете, как его решить?

4b9b3361

Ответ 1

удалите www., anysubdomain и все после /:

SUBSTRING_INDEX((SUBSTRING_INDEX((SUBSTRING_INDEX(url, 'http://', -1)), '/', 1)), '.', -2) as domain

Ответ 2

Мне пришлось объединить некоторые из предыдущих ответов, а также немного больше хакеров для моего набора данных. Это то, что работает для меня, оно возвращает домен и любые поддомены:

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

Объяснение (поскольку нетривиальный SQL редко имеет смысл):

SUBSTRING_INDEX(target_url, '/', 3) - разбивает любой путь, если url имеет протокол
SUBSTRING_INDEX(THAT, '://', -1) - удаляет любой протокол от THAT
SUBSTRING_INDEX(THAT, '/', 1) - удаляет любой путь от 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; 

Результаты:

'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'

Ответ 3

Все ответы, похоже, не работают для меня. Например, URL-адрес, который запускает переменные с помощью? для некоторых ответов не получается. Это работает для меня для всех видов URL-адресов:

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

Ответ 4

Если вы хотите найти первое появление /, почему вы передаете 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

Мне кажется, что мне легче.

Ответ 5

Это хорошо работает на моих очень грязных данных:

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

Ответ 6

Запрос должен учитывать отсутствие конечных "/"

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

Ответ 7

Лучше всего использовать его, поскольку он также будет захватывать URL-адрес, например "www.google.co.in"

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

Ответ 8

выберите SUBSTRING_INDEX (SUBSTRING_INDEX (URL, '://', -1), '/', 1) как DOMAIN

Ответ 9

Если вы хотите удалить www. а также http://, https://и/(путь) из вашего домена, пожалуйста, сделайте следующее:

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