2010-08-09 23 views
10

Tuve una búsqueda y encontré muchos ejemplos de expresiones regulares similares, pero no exactamente lo que necesito.Javascript/Regex para encontrar solo el nombre de dominio raíz sin subdominios

Quiero ser capaz de pasar en las siguientes direcciones URL y devolver los resultados:

  • www.google.com devuelve google.com

  • sub.domains. are.cool.google.com devuelve google.com

  • doesntmatterhowlongasubdomainis.idont.wantit.google.com devuelve google.com

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

Espero que tenga sentido :) ¡Gracias de antemano! -James

+11

¿Cuál será el resultado para 'sub.domain.google.co.uk'? –

+3

Esas no son URL sino solo nombres de dominio (excepto la última que es solo una cadena que puede interpretarse como nombre de dominio más ruta de URL). – Gumbo

+0

@pekka "google.co.uk" como lo haría apps.facebook.com return facebook.com. @gumbo Eso es correcto. Son solo ejemplos de lo que * podría * pasar. En su mayoría será una url completa (subdominio, dominio, carpetas, archivos). – jamesmhaley

Respuesta

10

No puede hacer esto con una expresión regular porque no sabe cuántos bloques tiene el sufijo.

Por ejemplo google.com tiene un sufijo de com. Para obtener desde subdomain.google.com a google.com, tendría que tomar los dos últimos bloques, uno para el sufijo y otro para google.

Si se aplica esta lógica a subdomain.google.co.uk aunque acabaría con co.uk.

Se necesitan realmente para buscar el sufijo de una lista como http://publicsuffix.org/

0

No he hecho muchas pruebas al respecto, b ut si entiendo lo que estás pidiendo, esto debería ser un punto de partida decente ...

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

EDIT:

Para aclarar, que está buscando:

uno o más personajes o guiones alfanuméricos, seguido por un punto literal

y luego una de las tres cosas ...

  1. tres o más caracteres alfabéticos (es decir com/net/mil/coop, etc.)
  2. dos caracteres alfabéticos, seguidos de un punto literal, seguido de dos alfas más (es decir, co.uk)
  3. dos caracteres alfabéticos (es decir, us/uk/to, etc.)

y al final de eso, un límite de palabra (\ b) que significa el final de la cadena, un espacio o un carácter no verbal (en los caracteres de las palabras regulares son típicamente alfanuméricos, y subrayado)

Como digo, no hice muchas pruebas, pero me pareció un punto de partida razonable. Probablemente necesites probarlo y sintonizarlo, e incluso entonces, es poco probable que obtengas el 100% de todos los casos de prueba. Hay consideraciones como los nombres de dominio Unicode y todo tipo de cosas técnicamente válidas pero que probablemente no se encuentren en el mundo salvaje que hagan tropezar una simple expresión regular como esta, pero esto probablemente lo consiga. tienes el 90% + del camino allí.

+0

Podría explicar lo que hace por favor, mi comprensión de la expresión regular es mínima. Y cómo se implementaría. – jamesmhaley

+1

90% es generoso. Básicamente, NO HAY una forma simple de hacer esto. El sistema de nombres de dominio es demasiado intrincado y permite muchas variaciones. – hallvors

+1

Teniendo en cuenta que los ejemplos proporcionados son dominios de aspecto "normal", creo que probablemente pueda alcanzar una parte sustancial, pero seguro, tal vez no el 90%. Como dije sin embargo (y realmente al grano) es poco probable que obtengas el 100% de todos tus casos de prueba. – theraccoonbear

6

No utilice expresiones regulares, utilizar el método .split() y trabajar desde allí.

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

Si su caso de uso es bastante estrecho, a continuación, puede comprobar el TLD, según sea necesario, y luego devolver los últimos 2 o 3 segmentos según el caso:

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

Se va a hacer sus ojos sangran menos que cualquier solución de expresiones regulares

+2

No funciona para url bbc.co.uk – didxga

0

Si tiene un subconjunto de datos limitado, le sugiero que mantenga la expresión regular simple, p. Ej.

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

Esto corresponderá:

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

En mi caso, sé que todas las URL pertinentes se adaptarán el uso de esta expresión regular.

Reúna un conjunto de datos de muestra y compárelo con su expresión regular. Al crear prototipos, puede hacerlo utilizando una herramienta como https://regex101.com/r/aG9uT0/1. En desarrollo, automatízalo usando un script de prueba.

Cuestiones relacionadas