• 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.

Re: Validación FTP mediante expresión regular

Notapor icsbcn » 2010-07-20 03:48 @200

salva escribiste:Si estas usando una versión de Perl reciente (5.10 o posterior), puedes utilizar la construcción given/when que hara que tu código sea más claro:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use 5.010;
  2.  
  3. given ($contingut) {
  4.   when (/^$RE{net}{IPv4}{dec}$/o) {
  5.     say "Es una IP";
  6.   }
  7.   when (/^$RE{URI}{HTTP}{-scheme => 'https?'}$/o) {
  8.     say "Es http o https";
  9.   }
  10.   when (/^$RE{URI}{FTP}{-password}$/o) {
  11.     say "Es un ftp";
  12.   }
  13.   default {
  14.     say "Es un dominio";
  15.   }
  16. }
  17.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Muchas gracias! Por suerte efectivamente tengo la versión v5.10.0
icsbcn
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2010-07-15 10:22 @473

Publicidad

Re: Validación FTP mediante expresión regular

Notapor salva » 2010-07-20 06:02 @293

icsbcn escribiste:Si es una ip, debo dividir entre el valor de la ip y el puerto si existiera.
Si es una url, debo dividir entre el valor del protocolo, nombre dominio, puerto y archivo (index.html) si existiera.
Si es un ftp, además tb deberí almacenar user and password si existiera.
Si es un dominio, sólo debería almacenar el nombre de dominio y el puerto y el archivo si existieran.

En la documentación de Regexp::Common lee donde explica el parámetro "keep"... entre eso y el paquete URI deberías de ser capaz de obtener todo lo que dices.
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Re: Validación FTP mediante expresión regular

Notapor explorer » 2010-07-20 11:44 @531

Un ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use 5.010;
  3. use strict;
  4. use warnings;
  5. use diagnostics;
  6.  
  7. use Regexp::Common qw/URI net/;
  8.  
  9.  
  10. my @URL = qw(
  11.     http://www.serial.es
  12.     http://www.serial.es/path
  13.     google.com
  14.     http://www.pepito.org
  15.     http://www.pep_ito.org
  16.     ftp://usuario:passwd@ftp.origen-es.org/public_html
  17.     http://89.174.4.4/webdav
  18.     217.127.87.93
  19. );
  20.  
  21. for (@URL) {
  22.     when (/^$RE{URI}{HTTP}{-scheme => 'https?'}{-keep}$/o) {
  23.         say "Es un URL con esquema HTTP: [$1]. Host: [$3]";
  24.     }
  25.  
  26.     when (/^$RE{URI}{FTP}{-password}{-keep}$/o) {
  27.         say "Es un URL con esquema FTP:  [$1]. Host: [$5]";
  28.     }
  29.  
  30.     when (/^$RE{net}{domain}{-nospace}{-keep}$/o) {
  31.         say "Es un dominio:              [$1]";
  32.     }
  33.  
  34.     when (/^$RE{net}{IPv4}{dec}{-keep}$/o) {
  35.         say "Es una dirección IP:        [$1]";
  36.     }
  37.  
  38.     default {
  39.         say "No sé lo que es [$_]";
  40.     }
  41. }
  42.  
  43. __END__
  44. Es un URL con esquema HTTP: [http://www.serial.es]. Host: [www.serial.es]
  45. Es un URL con esquema HTTP: [http://www.serial.es/path]. Host: [www.serial.es]
  46. Es un dominio:              [google.com]
  47. Es un URL con esquema HTTP: [http://www.pepito.org]. Host: [www.pepito.org]
  48. No sé lo que es [http://www.pep_ito.org]
  49. Es un URL con esquema FTP:  [ftp://usuario:passwd@ftp.origen-es.org/public_html]. Host: [ftp.origen-es.org]
  50. Es un URL con esquema HTTP: [http://89.174.4.4/webdav]. Host: [89.174.4.4]
  51. Es una dirección IP:        [217.127.87.93]
  52.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Aunque... hay una trampa... Está en comprobar, en último lugar, si es una IP... ¿Por qué?

Presta también atención a las marcas ^ y $, porque estamos comprobando toda la expresión, no una parte de ella. Sin ellas, la dirección http://www.pep_ito.org se daría como válida, por contener una parte válida: http://www.pep. Pero toda la dirección, no es correcta (no se permiten caracteres '_' en la parte del host)
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-21 03:06 @171

A ver,

Os cuento el problema que tengo...

-> Empezemos por las ip's...
Cuando reconozco una ip en mi string puedo tener 16 casos:
-> 192.178.10.100 En este caso debo almacenar la ip, simplemente.
-> 192.10.10.100:8080 En este caso debo almacernar la ip y el puerto.
-> 192.168.10.100/index.html En este caso debo almacenar ip y ruta
-> 192.168.10.100:8080/index.html En este caso debo almacenar ip, puerto y ruta
-> http://192.168.10.10 En este caso debo almacenar protocolo y ip
-> https://192.168.10.10:8080 En este caso debo almacenar protocolo, ip y puerto
-> http://192.168.10.100/index.html En este caso debo almacenar protocolo, ip y ruta
-> https://192.168.10.100:8080/index.htm En este caso debo almacenar protocolo, puerto y ruta
-> ftp://192.168.10.100 alamcenar protocolo y ip
-> ftp://192.168.10.100:8080 alamacenar protocolo, ip y puerto
-> ftp://192.168.10.100/index.txt protocolo, ip y ruta
-> ftp://192.168.10.100:8080/index.txt protocolo, ip, port i ruta
-> ftp://user:[email protected] En aquest cas haig d'emmagatzemar protocol, user, password, ip
-> ftp://user:[email protected]:8080 protocolo, user, password, ip, puerto
-> ftp://user:[email protected]/prova/index.html protocolo, user, password, ip, ruta
-> ftp://user:[email protected]:8080/prova/index.txt protocolo, user, password, ip, puerto, ruta.
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-21 05:57 @289

Creo que el apartado IP ya lo he resuelto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $ip_string = 'ftp://user:[email protected]:8080/prova/index.txt';
  2.  
  3. # Recuperar protocolo si existe
  4.         if ($ip_string =~ /^(http(s)?|ftp)+/) {
  5.                 ($protocolo, $ip_string) = split(/:\/\//, $ip_string, 2);
  6.         }
  7.  
  8.         # Recuperamos user y password si hay
  9.         if ($ip_string =~ /^\S+\:\S+\@/) {
  10.                 (my $auth, $ip_string) = split(/\@/, $ip_string, 2);
  11.                 ($usuario, $pwd) = split(/\:/, $auth, 2);
  12.         }
  13.  
  14.         # Recuperamos ruta si hay
  15.         if ($ip_string =~ /\//) {
  16.                 ($ip_string, $ruta) = split(/\//, $ip_string, 2);
  17.         }
  18.  
  19.         # Recuperamos puerto si hay
  20.         if ($ip_string =~ /\:/) {
  21.                 ($ip_value, $port_value) = split(/\:/, $ip_string, 2);
  22.         } else {
  23.                 $ip_value = $ip_string;
  24.         }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Ya os iré contando cómo va el resto...
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-21 06:38 @318

Haciendo unos pequeños cambios, con la solución -keep, ya te lo da hecho:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use 5.010;
  3. use strict;
  4. #use warnings;
  5. #use diagnostics;
  6.  
  7. use Regexp::Common qw/URI net/;
  8.  
  9.  
  10. my @URL = qw(
  11.  192.178.10.100
  12.  192.10.10.100:8080
  13.  192.168.10.100/index.html
  14.  192.168.10.100:8080/index.html
  15.  http://192.168.10.10
  16.  https://192.168.10.10:8080
  17.  http://192.168.10.100/index.html
  18.  https://192.168.10.100:8080/index.htm
  19.  ftp://192.168.10.100
  20.  ftp://192.168.10.100:8080
  21.  ftp://192.168.10.100/index.txt
  22.  ftp://192.168.10.100:8080/index.txt
  23.  ftp://user:password@192.168.10.100
  24.  ftp://user:password@192.168.10.100:8080
  25.  ftp://user:password@192.168.10.100/prova/index.html
  26.  ftp://user:password@192.168.10.100:8080/prova/index.txt
  27. );
  28.  
  29. for (@URL) {
  30.     say "[$_]";
  31.  
  32.     when (/^$RE{URI}{HTTP}{-scheme => 'https?'}{-keep}$/o) {
  33.         say
  34.             join("\n\t",
  35.                 'Es un URL con esquema HTTP',
  36.                 "Protocolo: [$2]",
  37.                 "Host:      [$3]",
  38.                 "Puerto:    [$4]",
  39.                 "Ruta:      [$5]"
  40.             )
  41.         ;
  42.     }
  43.  
  44.     when (/^$RE{URI}{HTTP}{-scheme => 'https?'}{-keep}$/o) {
  45.         say
  46.             join("\n\t",
  47.                 'Es un URL con esquema HTTP',
  48.                 "Protocolo: [$2]",
  49.                 "Host:      [$3]",
  50.                 "Puerto:    [$4]",
  51.                 "Ruta:      [$5]"
  52.             )
  53.         ;
  54.     }
  55.  
  56.     when (/^$RE{URI}{FTP}{-password}{-keep}$/o) {
  57.         say
  58.             join("\n\t",
  59.                 'Es un URL con esquema FTP',
  60.                 "Protocolo: [$2]",
  61.                 "Usuario:   [$3]",
  62.                 "Contraseña:[$4]",
  63.                 "Host:      [$5]",
  64.                 "Puerto:    [$6]",
  65.                 "Ruta:      [$7]"
  66.             )
  67.         ;
  68.     }
  69.  
  70.     when (/^$RE{net}{domain}{-nospace}{-keep}$/o) {
  71.         say "Es un dominio:              [$1]";
  72.     }
  73.  
  74.     when (/^$RE{net}{IPv4}{dec}{-keep}$/o) {
  75.         say "Es una dirección IP:        [$1]";
  76.     }
  77.  
  78.     default {
  79.         if ("http://$_" =~ /^$RE{URI}{HTTP}{-scheme => 'https?'}{-keep}$/o) {
  80.             say
  81.                 join("\n\t",
  82.                     'Es un URL con esquema HTTP',
  83.                     "Protocolo: [$2]",
  84.                     "Host:      [$3]",
  85.                     "Puerto:    [$4]",
  86.                     "Ruta:      [$5]"
  87.                 )
  88.             ;
  89.         }
  90.         else {
  91.             say "No sé lo que es [$_]";
  92.         }
  93.     }
  94. }
  95.  
  96. __END__
  97. [192.178.10.100]
  98. Es una dirección IP:        [192.178.10.100]
  99. [192.10.10.100:8080]
  100. Es un URL con esquema HTTP
  101.         Protocolo: [http]
  102.         Host:      [192.10.10.100]
  103.         Puerto:    [8080]
  104.         Ruta:      []
  105. [192.168.10.100/index.html]
  106. Es un URL con esquema HTTP
  107.         Protocolo: [http]
  108.         Host:      [192.168.10.100]
  109.         Puerto:    []
  110.         Ruta:      [/index.html]
  111. [192.168.10.100:8080/index.html]
  112. Es un URL con esquema HTTP
  113.         Protocolo: [http]
  114.         Host:      [192.168.10.100]
  115.         Puerto:    [8080]
  116.         Ruta:      [/index.html]
  117. [http://192.168.10.10]
  118. Es un URL con esquema HTTP
  119.         Protocolo: [http]
  120.         Host:      [192.168.10.10]
  121.         Puerto:    []
  122.         Ruta:      []
  123. [https://192.168.10.10:8080]
  124. Es un URL con esquema HTTP
  125.         Protocolo: [https]
  126.         Host:      [192.168.10.10]
  127.         Puerto:    [8080]
  128.         Ruta:      []
  129. [http://192.168.10.100/index.html]
  130. Es un URL con esquema HTTP
  131.         Protocolo: [http]
  132.         Host:      [192.168.10.100]
  133.         Puerto:    []
  134.         Ruta:      [/index.html]
  135. [https://192.168.10.100:8080/index.htm]
  136. Es un URL con esquema HTTP
  137.         Protocolo: [https]
  138.         Host:      [192.168.10.100]
  139.         Puerto:    [8080]
  140.         Ruta:      [/index.htm]
  141. [ftp://192.168.10.100]
  142. Es un URL con esquema FTP
  143.         Protocolo: [ftp]
  144.         Usuario:   []
  145.         Contraseña:[]
  146.         Host:      [192.168.10.100]
  147.         Puerto:    []
  148.         Ruta:      []
  149. [ftp://192.168.10.100:8080]
  150. Es un URL con esquema FTP
  151.         Protocolo: [ftp]
  152.         Usuario:   []
  153.         Contraseña:[]
  154.         Host:      [192.168.10.100]
  155.         Puerto:    [8080]
  156.         Ruta:      []
  157. [ftp://192.168.10.100/index.txt]
  158. Es un URL con esquema FTP
  159.         Protocolo: [ftp]
  160.         Usuario:   []
  161.         Contraseña:[]
  162.         Host:      [192.168.10.100]
  163.         Puerto:    []
  164.         Ruta:      [/index.txt]
  165. [ftp://192.168.10.100:8080/index.txt]
  166. Es un URL con esquema FTP
  167.         Protocolo: [ftp]
  168.         Usuario:   []
  169.         Contraseña:[]
  170.         Host:      [192.168.10.100]
  171.         Puerto:    [8080]
  172.         Ruta:      [/index.txt]
  173. [ftp://user:password@192.168.10.100]
  174. Es un URL con esquema FTP
  175.         Protocolo: [ftp]
  176.         Usuario:   [user]
  177.         Contraseña:[password]
  178.         Host:      [192.168.10.100]
  179.         Puerto:    []
  180.         Ruta:      []
  181. [ftp://user:password@192.168.10.100:8080]
  182. Es un URL con esquema FTP
  183.         Protocolo: [ftp]
  184.         Usuario:   [user]
  185.         Contraseña:[password]
  186.         Host:      [192.168.10.100]
  187.         Puerto:    [8080]
  188.         Ruta:      []
  189. [ftp://user:password@192.168.10.100/prova/index.html]
  190. Es un URL con esquema FTP
  191.         Protocolo: [ftp]
  192.         Usuario:   [user]
  193.         Contraseña:[password]
  194.         Host:      [192.168.10.100]
  195.         Puerto:    []
  196.         Ruta:      [/prova/index.html]
  197. [ftp://user:password@192.168.10.100:8080/prova/index.txt]
  198. Es un URL con esquema FTP
  199.         Protocolo: [ftp]
  200.         Usuario:   [user]
  201.         Contraseña:[password]
  202.         Host:      [192.168.10.100]
  203.         Puerto:    [8080]
  204.         Ruta:      [/prova/index.txt]
  205.  
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4
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 salva » 2010-07-21 07:21 @348

Algo un poco más compacto ;-)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use 5.010;
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. use URI;
  7. use Data::Dumper;
  8.  
  9. my @url = qw( 192.178.10.100
  10.               192.10.10.100:8080
  11.               192.168.10.100/index.html
  12.               192.168.10.100:8080/index.html
  13.               http://192.168.10.10
  14.               https://192.168.10.10:8080
  15.               http://192.168.10.100/index.html
  16.               https://192.168.10.100:8080/index.htm
  17.               ftp://192.168.10.100
  18.               ftp://192.168.10.100:8080
  19.               ftp://192.168.10.100/index.txt
  20.               ftp://192.168.10.100:8080/index.txt
  21.               ftp://user:password@192.168.10.100
  22.               ftp://user:password@192.168.10.100:8080
  23.               ftp://user:password@192.168.10.100/prova/index.html
  24.               ftp://user:password@192.168.10.100:8080/prova/index.txt
  25.            );
  26.  
  27. for my $url (@url) {
  28.     my ($scheme) = $url =~ m|^(\w+)://|;
  29.     my $uri = URI->new(defined $scheme ? $url : "http://$url");
  30.     my %h = map { $_ => scalar eval { $uri->$_ } } qw(scheme host port user password userinfo path frag);
  31.     $h{scheme} = $scheme;
  32.     my $dumper = Data::Dumper->new([\%h], ['data']);
  33.     $dumper->Terse(1)->Deepcopy(1)->Indent(0);
  34.     say "$url ===> " . $dumper->Dump;
  35. }
  36.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Re: Validación FTP mediante expresión regular

Notapor icsbcn » 2010-07-21 10:20 @472

explorer escribiste:Haciendo unos pequeños cambios, con la solución -keep, ya te lo da hecho:


¡¡¡Muchas gracias!!! Así es mucho más rápido.

Ahora lo que pasa es que hay algunos casos que no estoy cubriendo y debería...
192.10.10.100:8080 -> Tengo que diferenciar entre IP y puerto
192.168.10.100:8080/index.html -> Tengo que diferenciar entre IP, puerto y ruta.
Y los mismo para los dominios: http://www.google.es/index.htm o google.com:8080 o google.com:8080/backup.php
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-21 10:22 @473

salva escribiste:Algo un poco más compacto ;-)


¡Gracias! Cuando pueda lo pruebo
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-21 10:31 @479

Resumiendo...

Ahora mis casos se han duplicado... ahora ya tengo 24...
Y en todos ellos, debo almacenar: protocolo, dominio/ip, puerto, ruta, user, password (si algún campo no existe almaceno null)

-> 192.178.10.100
-> 192.10.10.100:8080
-> 192.168.10.100/index.html
-> 192.168.10.100:8080/index.html
-> http://192.168.10.10
-> https://192.168.10.10:8080
-> http://192.168.10.100/index.html
-> https://192.168.10.100:8080/index.htm
-> ftp://192.168.10.100
-> ftp://192.168.10.100:8080
-> ftp://192.168.10.100/index.txt
-> ftp://192.168.10.100:8080/index.txt
-> ftp://user:[email protected]
-> ftp://user:[email protected]:8080
-> ftp://user:[email protected]/prova/index.html
-> ftp://user:[email protected]:8080/prova/index.txt
-> http://www.example.com
-> http://www.example.com:8080
-> http://www.example.com/index.html
-> http://www.example.com:8080/index.html
-> http://www.example.com
-> https://www.example.com:8080
-> http://www.example.com/index.html
-> https://www.example.com:8080/index.htm
-> ftp://www.example.com
-> ftp://www.example.com:8080
-> ftp://www.example.com/index.txt
-> ftp://www.example.com:8080/index.txt
-> ftp://user:[email protected]
-> ftp://user:[email protected]:8080
-> ftp://user:[email protected]/prova/index.html
-> ftp://user:[email protected]:8080/prova/index.txt
icsbcn
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2010-07-15 10:22 @473

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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