Esos no son dominios. Las entradas que empiezan por http:// están especificando lugares o servidores, pero no dominios. De los tres ejemplos que has puesto, solo el de google.com se puede considerar que es un dominio.
Incluso si quitáramos la parte de http:// tampoco se podría considerar a http://www.serial.es como un dominio, sino como un servidor (
host).
Así que lo primero que debes decidir es si quieres verificar la escritura de servidores, dominios, o lugares.
Ahora bien, si nos atenemos a lo que dices ("dominios"), entonces tenemos otro problema, ya que debemos quedarnos solo con la parte de dominio indicada (quitar el protocolo http:// y la indicación de
host), y eso no es tan obvio.
Lo normal es que los dominios sean siempre de primer nivel (pero no siempre). Si ese es el caso, podemos hacer un procedimiento para extraerlo, pero es igual de complejo que el caso anterior, ya que un dominio se puede escribir de muchas maneras, y además, hay dos estándares en cuanto a la longitud máxima, por etiqueta y por longitud total del nombre del dominio.
Mirando el código de
Regexp::Common::URI::RFC2396, podemos sacar las siguientes expresiones regulares:
Using perl Syntax Highlighting
$alpha = '[a-zA-Z]'; # lowalpha | upalpha
$alphanum = '[a-zA-Z0-9]'; # alpha | digit
$toplabel = "(?:$alpha"."[-a-zA-Z0-9]*$alphanum|$alpha)";
$domainlabel = "(?:(?:$alphanum"."[-a-zA-Z0-9]*)?$alphanum)";
$hostname = "(?:(?:$domainlabel\[.])*$toplabel\[.]?)";Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
$toplabel se refiere a la parte del dominio relativa al dominio de primer nivel. Por eso, un $hostname es cero o más $domainlabel, seguidos de un '.' y seguidos de un $toplabel.
Así que quedaría algo así:
(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]*)?[a-zA-Z0-9])[.])*(?:[a-zA-Z][-a-zA-Z0-9]*[a-zA-Z0-9]|[a-zA-Z]))(He quitado el último
[.]?, ya que no aparece en el RFC 1738, y solo se refiere a la definición de dominio dentro de un registro DNS)
Quedaría por hacer expresiones regulares para quitar la parte primera, y, opcionalmente, alguna parte del final, como el caso de
http:://www.serial.es/ (una barra al final).
Desde luego, todo esto ya está estudiado en Perl desde hace mucho tiempo, y es fácil de manejar. Existe el módulo
URI::Split (módulo ya instalado), que es capaz de extraer la información de un URI.
Si, por otra parte, se trata de hacer un procedimiento sencillo, que diga un sí o no a un determinado valor, se puede hacer algo como esto:
Using perl Syntax Highlighting
#!/usr/bin/perl
my $alpha = '[a-zA-Z]'; # lowalpha | upalpha
my $alphanum = '[a-zA-Z0-9]'; # alpha | digit
my $toplabel = "(?:$alpha"."[-a-zA-Z0-9]*$alphanum|$alpha)";
my $domainlabel = "(?:(?:$alphanum"."[-a-zA-Z0-9]*)?$alphanum)";
my $hostname = "(?:(?:$domainlabel\[.])*$toplabel)";
my @dominios = qw(
http://www.serial.es
http://www.serial.es/path
google.com
http://www.pepito.org
http://www.pep_ito.org
);
for my $dominio (@dominios) {
$dominio =~ s{http://}{}i; # quitamos el esquema, si lo hubiera
print "[$dominio] => ";
if ($dominio =~ m/^$hostname$/) { # ¿sigue la nomenclatura de un host?
print 'Sí';
}
else {
print 'No';
}
print " es un host\n";
}
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Pero fíjate que solo estamos validando servidores, no dominios. Para pasar de uno a otro, habría que decidir el nivel de profundidad de esos dominios. Quiero decir, que si sabemos que consideramos que un dominio es hasta de un segundo nivel, podemos intentar extraerlo del nombre del servidor:
Using perl Syntax Highlighting
#!/usr/bin/perl
my $alpha = '[a-zA-Z]';
my $alphanum = '[a-zA-Z0-9]';
my $toplabel = "(?:$alpha"."[-a-zA-Z0-9]*$alphanum|$alpha)";
my $domainlabel = "(?:(?:$alphanum"."[-a-zA-Z0-9]*)?$alphanum)";
my $hostname = "(?:(?:$domainlabel\[.])*$toplabel)";
my @URIS = qw(
http://www.serial.es
http://www.serial.es/path
google.com
http://www.pepito.org
http://www.pep_ito.org
);
for my $URI (@URIS) {
print "[$URI]=>";
($servidor = $URI) =~ s{http://}{}i;
if (!$servidor) {
print " Nombre de servidor no encontrado\n";
next;
}
else {
# nombre de servidor correcto
if ($servidor =~ m/^$hostname$/) {
# extraemos el dominio
($dominio) = $servidor =~ m/($domainlabel[.]$toplabel)$/;
}
else {
print " Nombre de servidor no correcto\n";
next;
}
if ($dominio) {
print "[$servidor]=>[$dominio]\n";
}
else {
print " Nombre de dominio no encontrado\n";
next;
}
}
}
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Sale:
Using text Syntax Highlighting
[http://www.serial.es]=>[www.serial.es]=>[serial.es]
[http://www.serial.es/path]=> Nombre de servidor no correcto
[google.com]=>[google.com]=>[google.com]
[http://www.pepito.org]=>[www.pepito.org]=>[pepito.org]
[http://www.pep_ito.org]=> Nombre de servidor no correcto
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Y ya tenemos los nombres de dominio (de hasta segundo nivel) que estén correctamente escritos.