2012-02-14 8 views
12

dispiace per il mio inglesequery MySQL per estrarre i domini da URL

ho questa query per estrarre dominio da URL

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

funziona solo quando l'URL è come www.google.com/something

non funziona con URL come

www.google.it (senza slash)

www.google.it/abc/xzy/ (permalink)

sai come risolverlo?

+0

Eventuali duplicati (o almeno molto simili): http://stackoverflow.com/questions/3521094/how-we-can-find-domain-name-using-mysql-and-regular-expression –

risposta

2

Se si desidera trovare la prima occorrenza di /, perché si passa da 8 a LOCATE come posizione di partenza? (Suppongo di saltare barre dopo che il protocollo come http: // ma se vi aspettate anche url di senza un protocollo, in considerazione quelli brevi come cnn.com/page)

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

alternativa:

SUBSTRING_INDEX(url, '/', 1) AS domain 

Quest'ultima sembra più facile per me. .

14

rimuovere www, anysubdomain e tutto ciò dopo /:

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

Utilizzato questo, ha funzionato correttamente dopo aver modificato 'http: //' in ': //' consentendo https. –

+3

Siamo spiacenti, questo non funziona con domini con doppi punti, come api.site.com –

+1

Quando hai http e https nel tuo campo puoi usare qualcosa come 'CASE WHEN SUBSTRING (url, 1,5) = ' https ' THEN SUBSTRING_INDEX ((SUBSTRING_INDEX ((SUBSTRING_INDEX (url,' https: // ', -1)),'/', 1)),'. ', -2) ELSE SUBSTRING_INDEX ((SUBSTRING_INDEX ((SUBSTRING_INDEX (url, 'http: //', -1)), '/', 1)), '.', -2) END' – Redithion

0

La query deve tenere conto di nessun trascinamento '/'

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

questo funziona bene sul mio dati molto disordinato:

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

migliore di usarlo come sarà anche catturare URL del tipo "www.google.co.in"

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

Tutte le risposte non sembrano funzionare per me. Ad esempio, un URL che avvia variabili con un? fallisce per alcune risposte. Questo funziona per me per tutti i tipi di URL:

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

ho dovuto combinare alcune delle risposte precedenti, oltre a un po 'di più aggiustamenti per il mio set di dati.Questo è ciò che funziona per me, restituisce il dominio e gli eventuali sottodomini:

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

Spiegazione (causa non banale SQL raramente ha senso):

SUBSTRING_INDEX(target_url, '/', 3) - strisce qualsiasi percorso se l'URL è un protocollo
SUBSTRING_INDEX(THAT, '://', -1) - strisce qualsiasi protocollo da CHE
SUBSTRING_INDEX(THAT, '/', 1) - strisce qualsiasi percorso da CHE (se non ci fosse alcun protocollo)
SUBSTRING_INDEX(THAT, '?', 1) - strisce la stringa di query da CHE (se non c'era alcun percorso o di discesa /)

Test Cases:

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; 

risultati:

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

ha funzionato perfettamente per i valori casuali nel campo url, compresi i non url, grazie – Lizardx

+0

anche corrispondere www come sottodominio. – Kliptu

+0

interessante, quale input hai usato? Lo esaminerò. – LostNomad311

0

selezionare SUBSTRING_INDEX (SUBSTRING_INDEX (URL, ': //', -1), '/', 1) come DOMINIO

1

Se si desidera rimuovere www. insieme con http: //, https: // e/(percorso) dal tuo dominio si prega di fare questo:

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