2010-08-09 12 views
10

Ho avuto una ricerca e ho trovato molti esempi di regex simili, ma non proprio quello di cui ho bisogno.Javascript/Regex per trovare solo il nome del dominio radice senza sottodomini

Voglio essere in grado di passare nei seguenti URL e restituire i risultati:

  • www.google.com restituisce google.com

  • sub.domains. is.cool.google.com restituisce google.com

  • doesntmatterhowlongasubdomainis.idont.wantit.google.com restituisce google.com

  • sub.domain.google.com/no/thanks restituisce google.com

Spero che abbia senso :) Grazie in anticipo! -James

+11

Quale sarà il risultato per "sub.domain.google.co.uk'? –

+3

Questi non sono URL ma solo nomi di dominio (tranne l'ultimo che è solo una stringa che può essere interpretata come nome di dominio più un percorso URL). – Gumbo

+0

@pekka "google.co.uk" così come apps.facebook.com restituirà facebook.com. @gumbo È corretto. Sono solo esempi di ciò che * potrebbe * essere passato. Per lo più sarà un URL completo (sottodominio, dominio, cartelle, file). – jamesmhaley

risposta

10

Non è possibile eseguire questa operazione con un'espressione regolare perché non si conoscono quanti blocchi sono presenti nel suffisso.

Ad esempio google.com ha un suffisso di com. Per ottenere da sottodominio.google.com a google.com devi prendere gli ultimi due blocchi: uno per il suffisso e uno per google.

Se si applica questa logica di subdomain.google.co.uk se si finirebbe con co.uk.

Sarà effettivamente bisogno di cercare il suffisso da una lista come http://publicsuffix.org/

0

Non ho fatto molti test su questo, b ut se ho capito quello che stai chiedendo, questo dovrebbe essere un punto di partenza decente ...

([A-Za-z0-9-]+\.([A-Za-z]{3,}|[A-Za-z]{2}\.[A-Za-z]{2}|[A-za-z]{2}))\b 

EDIT:

Per chiarire, che sta cercando:

uno o più caratteri alfanumerici o trattini, seguite da un punto letterale

e quindi una delle tre cose ...

  1. tre o più caratteri alfa (ad es. com/net/mil/coop, ecc.)
  2. due caratteri alfa, seguiti da un punto letterale, seguito da altri due alpha (cioè co.uk)
  3. due caratteri alfa (ovvero noi/uk/a, ecc.)

e alla fine di questo, un confine di parola (\ b) significa la fine della stringa, uno spazio o un carattere non-parola (in caratteri alfanumerici espressioni regolari sono tipicamente caratteri alfanumerici e di sottolineatura).

Come ho detto, non ho fatto molti test, ma sembrava un punto di partenza ragionevole. Probabilmente dovresti provarlo e modificarlo, e anche in questo caso è improbabile che otterrai il 100% per tutti i casi di test. Ci sono considerazioni come i nomi di dominio Unicode e tutti i tipi di cose valide dal punto di vista tecnico, ma-non-probabilmente-non-incontrate-nel-selvaggio che faranno saltare una semplice regex come questa, ma questo probabilmente otterrà il 90% + del modo in cui ci sono.

+0

Puoi spiegare cosa fa per favore, la mia comprensione della regex è minima. E come sarebbe implementato. – jamesmhaley

+1

Il 90% è generoso. Fondamentalmente, non c'è un modo semplice per farlo. Il sistema dei nomi di dominio è troppo complicato e consente molte varianti. – hallvors

+1

Dato che gli esempi forniti sono domini dall'aspetto "normale", penso che si possa probabilmente raggiungere una fetta consistente, ma certo, forse non al 90%. Come ho detto, però (e davvero al punto) è improbabile che tu possa ottenere il 100% per tutti i tuoi casi di test. – theraccoonbear

6

Non utilizzare regex, utilizzare il metodo .split() e lavorare da lì.

var s = domain.split('.'); 

Se il vostro caso d'uso è abbastanza stretta si potrebbe quindi controllare il TLD, se necessario, e poi tornare gli ultimi 2 o 3 segmenti a seconda dei casi:

return s.slice(-2).join('.'); 

Ti farà sanguinare gli occhi meno di qualsiasi soluzione regex.

+2

Non funziona per url bbc.co.uk – didxga

0

Se si dispone di un sottoinsieme limitato di dati, suggerisco di mantenere la regex semplice, ad es.

(([a-z\-]+)(?:\.com|\.fr|\.co.uk)) 

Questo corrisponderà:

www.google.com --> google.com 
www.google.co.uk --> google.co.uk 
www.foo-bar.com --> foo-bar.com 

Nel mio caso, io so che tutti gli URL pertinenti saranno raffrontati con questa espressione regolare.

Colleziona un set di dati campione e testalo contro la tua espressione regolare. Durante la prototipazione, puoi farlo utilizzando uno strumento come https://regex101.com/r/aG9uT0/1. In fase di sviluppo, automatizzarlo utilizzando uno script di test.

Problemi correlati