2009-07-27 15 views
10

Tengo un montón de nombres de dominio como este:Regex para extraer el subdominio de la URL?

http://subdomain.example.com (example.com es siempre example.com, pero el subdominio varía).

Necesito "subdominio".

¿Podría ayudarme una persona amable que tuvo la paciencia de aprender Regex?

+1

¿Está permitido el subdominio? –

+0

Sí, puede tener string.string.domain.gtld –

Respuesta

19
/(http:\/\/)?(([^.]+)\.)?domain\.com/ 

Luego $ 3 (o \ 3) contendrá "subdominio" si se proporcionó uno.

Si usted quiere tener el subdominio en el primer grupo, y su motor de expresiones regulares apoya grupos no captura (grupos tímidos), utilice esto como lo sugiere palindrom:

/(?:http:\/\/)?(?:([^.]+)\.)?domain\.com/ 
+0

O /(?:http://)?(?:([^.]+)\.)?domain.com/ y $ 1 contendrá el subdominio – palindrom

+0

Cierto. No mencionó el idioma/biblioteca, así que quería que la expresión regular fuera lo más portable posible, no estoy seguro si todas las implementaciones permiten grupos que no capturan. – Draemon

+0

¿Qué pasa si no sabes qué es 'domain'? –

4

Puramente la cadena subdominio (resultado es $ 1):

^http://([^.]+)\.domain\.com 

Haciendo http:// opcional (el resultado es $ 2):

^(http://)?([^.]+)\.domain\.com 

Hacer el http:// y el subdominio opcional (resultado es $ 3):

(http://)?(([^.]+)\.)?domain\.com 
2

Sólo debe ser

\Qhttp://\E(\w+)\.domain\.com 

El subdominio será el primer grupo.

0

primero grupo de

http://(.*).example.com 
+1

Olvidando, por supuesto, que '. *' Coincidirá con una cadena vacía y, más importante aún, que el período representa ** cualquier carácter **. –

0
#!/usr/bin/perl 

use strict; 
use warnings; 

my $s = 'http://subdomain.example.com'; 
my $subdomain = (split qr{/{2}|\.}, $s)[1]; 

print "'$subdomain'\n"; 
29

El problema con la expresión regular anterior es: si usted no sabe lo que es el protocolo, o lo que es el sufijo de dominio, obtendrá algunos resultados inesperados. Aquí hay un poco de cuentas Regex para esas situaciones. : D

/(?:http[s]*\:\/\/)*(.*?)\.(?=[^\/]*\..{2,5})/i //javascript 

Esto siempre debe devolver el subdominio (si está presente) en el grupo 1. Aquí está en un ejemplo de JavaScript, pero también debería funcionar para cualquier otro motor que apoya las afirmaciones de preanálisis positivos:

// EXAMPLE of use 
var regex = /(?:http[s]*\:\/\/)*(.*?)\.(?=[^\/]*\..{2,5})/i 
    , whoKnowsWhatItCouldBe = [ 
         "www.mydomain.com/whatever/my-site" //matches: www 
         , "mydomain.com"// does not match 
         , "http://mydomain.com" // does not match 
         , "https://mydomain.com"// does not match 
         , "banana.com/somethingelse" // does not match 
         , "https://banana.com/somethingelse.org" // does not match 
         , "http://what-ever.mydomain.mu" //matches: what-ever 
         , "dev-www.thisdomain.com/whatever" // matches: dev-www 
         , "hot-MamaSitas.SomE_doma-in.au.xxx"//matches: hot-MamaSitas 
        , "http://hot-MamaSitas.SomE_doma-in.au.xxx" // matches: hot-MamaSitas 
        , "пуст.пустыня.ru" //even non english chars! Woohoo! matches: пуст 
        , "пустыня.ru" //does not match 
        ]; 

// Run a loop and test it out. 
for (var i = 0, length = whoKnowsWhatItCouldBe.length; i < length; i++){ 
    var result = whoKnowsWhatItCouldBe[i].match(regex); 
    if(result != null){ 
     // YAY! We have a match! 
    } else { 
     // Boo... No subdomain was found 
    } 
} 
+3

esta es claramente la mejor respuesta porque representa el protocolo, ninguno/múltiples subdominios, y es independiente del dominio. – mastaBlasta

+2

¡Trabajo fenomenal! – plast1K

+2

Esta es la mejor respuesta, y debe ser absolutamente la aceptada. –

Cuestiones relacionadas