• Publicidad

Validación FTP mediante expresión regular

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Validación FTP mediante expresión regular

Notapor icsbcn » 2010-07-15 10:24 @475

Hola,

Me gustaría encontrar una expresión regular que validara (en Perl) una URL de tipo FTP.
Por ejemplo: ftp://username:[email protected]/path1/example.txt

¿Alguien me puede ayudar?

Muchas gracias.
icsbcn
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2010-07-15 10:22 @473

Publicidad

Re: Validación FTP mediante expresión regular

Notapor explorer » 2010-07-15 14:17 @636

Bienvenido a los foros de Perl en Español, icsbcn.

Aquí tienes una solución muy sencilla, con la ayuda del módulo Regexp::Common::URI.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6.  
  7. use Regexp::Common 'URI';
  8.  
  9.  
  10. my $posible_FTP = 'ftp://username:[email protected]/path1/example.txt';
  11.  
  12.  
  13. if ( $posible_FTP =~ $RE{URI}{FTP}{-password} ) {
  14.  
  15.     print "Sí es un URI FTP\n";
  16. }
  17.  
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4

Más información específica sobre ftp en Regexp::Common::URI::ftp.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Validación FTP mediante expresión regular

Notapor icsbcn » 2010-07-16 03:14 @176

Hola,

Muchas gracias por tu rápida respuesta.

Mi problema es que no puedo usar módulos de Perl.
Sólo puedo usar una expresión regular (compatible con Perl) para validar un input de un formulario... :(
icsbcn
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2010-07-15 10:22 @473

Re: Validación FTP mediante expresión regular

Notapor explorer » 2010-07-16 03:50 @201

Pues sí que es raro que no puedas instalar módulos. Debe ser una situación horrible. Igual que a un programador de Java decirle que no puede instalar nada. O que un programador de .Net tampoco puede usar ninguna librería externa... ;)

Puedes hacer que Regexp::Common::URI pinte la expresión regular que está usando:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print $RE{URI}{FTP}{-password};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y el resultado es:

(?:(?:ftp)://(?:(?:(?:(?:[a-zA-Z0-9\-_.!~*'();&=+$,]+|(?:%[a-fA-F0-9][a-fA-F0-9]))*))(?::(?:(?:(?:[a-zA-Z0-9\-_.!~*'();&=+$,]+|(?:%[a-fA-F0-9][a-fA-F0-9]))*)))?@)?(?:(?:(?:(?:(?:(?:[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])[.]?)|(?:[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+)))(?::(?:(?:[0-9]*)))?(?:/(?:(?:(?:(?:(?:[a-zA-Z0-9\-_.!~*'():@&=+$,]+|(?:%[a-fA-F0-9][a-fA-F0-9]))*)(?:/(?:(?:[a-zA-Z0-9\-_.!~*'():@&=+$,]+|(?:%[a-fA-F0-9][a-fA-F0-9]))*))*))(?:;type=(?:[AIai]))?))?)

Pues sí: hacer una expresión regular que tenga en cuenta todos los posibles casos detallados por los RFC 1738 y RFC 2396, no es tan sencillo.

Es obvio que es preferible usar módulos...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Validación FTP mediante expresión regular

Notapor icsbcn » 2010-07-16 04:15 @219

¡¡Muchas gracias!!!

¡¡¡Creo que es perfecta!!!

Siento abusar de ti... ¿pero conoces alguna expresión regular para validar dominios?

Ejemplos:

http://www.serial.es
google.com
http://www.pepito.org
icsbcn
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2010-07-15 10:22 @473

Re: Validación FTP mediante expresión regular

Notapor icsbcn » 2010-07-16 04:57 @248

Hola de nuevo,

Te cuento / os cuento mi problemática:

Necesitaba una expresión regular que validara:

-> Ip's
-> URL's (http/https)
-> FTP's
-> Dominios

Y lo mejor que he obtenido ha sido esto (gracias a vuestra ayuda...):

(^(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])){3}(:(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[0-5]?([0-9]){0,3}[0-9]))?$)|(^(https?://)?(([0-9a-z_!~*'().&=+$%-]+:)?[0-9a-z_!~*'().&=+$%-]+@)?(([0-9]{1,3}\.){3}[0-9]{1,3}|([0-9a-z_!~*'()-]+\.)*([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.[a-z]{2,6})(:[0-9]{1,4})?((/?)|(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$)|(?:(?:ftp)://(?:(?:(?:(?:[a-zA-Z0-9\-_.!~*'();&=+$,]+|(?:%[a-fA-F0-9][a-fA-F0-9]))*))(?::(?:(?:(?:[a-zA-Z0-9\-_.!~*'();&=+$,]+|(?:%[a-fA-F0-9][a-fA-F0-9]))*)))?@)?(?:(?:(?:(?:(?:(?:[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])[.]?)|(?:[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+)))(?::(?:(?:[0-9]*)))?(?:/(?:(?:(?:(?:(?:[a-zA-Z0-9\-_.!~*'():@&=+$,]+|(?:%[a-fA-F0-9][a-fA-F0-9]))*)(?:/(?:(?:[a-zA-Z0-9\-_.!~*'():@&=+$,]+|(?:%[a-fA-F0-9][a-fA-F0-9]))*))*))(?:;type=(?:[AIai]))?))?)

¿Qué os parece?
icsbcn
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2010-07-15 10:22 @473

Re: Validación FTP mediante expresión regular

Notapor explorer » 2010-07-16 06:43 @321

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:
Sintáxis: [ Descargar ] [ Ocultar ]
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.001 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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. my $alpha             =  '[a-zA-Z]';                # lowalpha | upalpha
  4. my $alphanum          =  '[a-zA-Z0-9]';             # alpha    | digit
  5. my $toplabel          =  "(?:$alpha"."[-a-zA-Z0-9]*$alphanum|$alpha)";
  6. my $domainlabel       =  "(?:(?:$alphanum"."[-a-zA-Z0-9]*)?$alphanum)";
  7. my $hostname          =  "(?:(?:$domainlabel\[.])*$toplabel)";
  8.  
  9. my @dominios = qw(
  10.     http://www.serial.es
  11.     http://www.serial.es/path
  12.     google.com
  13.     http://www.pepito.org
  14.     http://www.pep_ito.org
  15. );
  16.  
  17. for my $dominio (@dominios) {
  18.  
  19.     $dominio =~ s{http://}{}i;              # quitamos el esquema, si lo hubiera
  20.  
  21.     print "[$dominio] => ";
  22.  
  23.     if ($dominio =~ m/^$hostname$/) {       # ¿sigue la nomenclatura de un host?
  24.         print 'Sí';
  25.     }
  26.     else {
  27.         print 'No';
  28.     }
  29.  
  30.     print " es un host\n";
  31. }
  32.  
Coloreado en 0.001 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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. my $alpha             =  '[a-zA-Z]';
  4. my $alphanum          =  '[a-zA-Z0-9]';
  5. my $toplabel          =  "(?:$alpha"."[-a-zA-Z0-9]*$alphanum|$alpha)";
  6. my $domainlabel       =  "(?:(?:$alphanum"."[-a-zA-Z0-9]*)?$alphanum)";
  7. my $hostname          =  "(?:(?:$domainlabel\[.])*$toplabel)";
  8.  
  9. my @URIS = qw(
  10.     http://www.serial.es
  11.     http://www.serial.es/path
  12.     google.com
  13.     http://www.pepito.org
  14.     http://www.pep_ito.org
  15. );
  16.  
  17. for my $URI (@URIS) {
  18.  
  19.     print "[$URI]=>";
  20.  
  21.     ($servidor = $URI) =~ s{http://}{}i;
  22.  
  23.     if (!$servidor) {
  24.         print " Nombre de servidor no encontrado\n";
  25.         next;
  26.     }
  27.     else {
  28.         # nombre de servidor correcto
  29.         if ($servidor =~ m/^$hostname$/) {
  30.             # extraemos el dominio
  31.             ($dominio) = $servidor =~ m/($domainlabel[.]$toplabel)$/;
  32.         }
  33.         else {
  34.             print " Nombre de servidor no correcto\n";
  35.             next;
  36.         }
  37.  
  38.         if ($dominio) {
  39.             print "[$servidor]=>[$dominio]\n";
  40.         }
  41.         else {
  42.             print " Nombre de dominio no encontrado\n";
  43.             next;
  44.         }
  45.     }
  46. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Sale:
Sintáxis: [ Descargar ] [ Ocultar ]
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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Validación FTP mediante expresión regular

Notapor icsbcn » 2010-07-16 08:49 @409

¡¡¡Muchísimas gracias!!!
icsbcn
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2010-07-15 10:22 @473

Re: Validación FTP mediante expresión regular

Notapor icsbcn » 2010-07-19 02:25 @142

Hola,

¡¡¡Buff!!! Esto de las expresiones regulares es muy difícil!!!

Ahora ya he conseguido validar mi entrada con una expresión regular, ¡¡¡pero ahora viene los más complicado!!!

Después de validar mi string, debo:

-> Saber si lo que tengo es:
-> una IP (con o sin puerto). Para validar IP he usado: ^(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])){3}(:(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[0-5]?([0-9]){0,3}[0-9]))?$
-> una URL (http, https o ftp):
-> Para validar http o http uso: ^(https?://)?(([0-9a-z_!~*'().&=+$%-]+:)?[0-9a-z_!~*'().&=+$%-]+@)?(([0-9]{1,3}\.){3}[0-9]{1,3}|([0-9a-z_!~*'()-]+\.)*([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.[a-z]{2,6})(:[0-9]{1,4})?((/?)|(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$
-> Para validar ftp uso: (?:(?:ftp)://(?:(?:(?:(?:[a-zA-Z0-9\-_.!~*'();&=+$,]+|(?:%[a-fA-F0-9][a-fA-F0-9]))*))(?::(?:(?:(?:[a-zA-Z0-9\-_.!~*'();&=+$,]+|(?:%[a-fA-F0-9][a-fA-F0-9]))*)))?@)?(?:(?:(?:(?:(?:(?:[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])[.]?)|(?:[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+)))(?::(?:(?:[0-9]*)))?(?:/(?:(?:(?:(?:(?:[a-zA-Z0-9\-_.!~*'():@&=+$,]+|(?:%[a-fA-F0-9][a-fA-F0-9]))*)(?:/(?:(?:[a-zA-Z0-9\-_.!~*'():@&=+$,]+|(?:%[a-fA-F0-9][a-fA-F0-9]))*))*))(?:;type=(?:[AIai]))?))?)
-> un dominio.

Cuando sé si lo que tengo es un dominio, una URL o una IP. Debo "descomponerlos"...

-> ip: ip,puerto
-> dominio: dominio, puerto
-> url: protocolo, dominio, puerto
-> ftp: protocolo, dominio, puerto, user, password, file

¿Alguien sabe por dónde puedo empezar?

Muchas gracias.
icsbcn
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2010-07-15 10:22 @473

Re: Validación FTP mediante expresión regular

Notapor explorer » 2010-07-19 03:20 @180

¿El módulo URI::Split, indicado antes, no te ha servido?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 26 invitados

cron