• Publicidad

Problema con expresión regular

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Problema con expresión regular

Notapor magnobalt » 2010-03-24 18:05 @795

Buenas, necesito una ayuda con una expresión regular. Resulta que tengo la salida de un texto que está delimitado por unas etiquetas que lo llamo de esta forma

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
EMPIEZA_AQUI
texto texto numeros
numero texto texto numeros
texcto numeros
texto
TERMINA AQUI
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Lo que necesito es poder obtener el texto que está dentro de las etiquetas COMIENZA_AQUI TERMINA_AQUI; intenté hacerlo de esta forma:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$respuesta =~ m/EMPIEZA_AQUI(.*)TERMINA_AQUI/g;
print "$1";
 
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Creo que el problema radica en los retornos a carros pero intenté también de esta forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$respuesta=~m/EMPIEZA_AQUI(.*\n*)TERMINA_AQUI/i;
print "$1";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Le agradecería si alguien me puede ayudar, la salida original de esta leyenda es similar a esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <html>          
  2. <body bgcolor=silver>
  3. <h1>Este es el ejemplo de un LFI y RF</h1>
  4. EMPIEZA_AQUI
  5. total 33
  6. drwxr-xr-x  2 magno magno  272 mar 24 19:48 .
  7. drwxr-xr-x 12 magno magno 1448 mar 24 16:31 ..
  8. -rwxr-xr-x  1 root  root    53 mar 24 17:34 cmd1.txt
  9. -rw-r--r--  1 root  root    87 mar 24 19:48 cmd.txt
  10. -rw-r--r--  1 magno magno  171 mar 24 18:11 probar.pl
  11. -rw-r--r--  1 magno magno  170 mar 24 18:11 probar.pl~
  12. -rwxr-xr-x  1 magno magno  159 mar 24 17:35 rfi_lfi.php
  13. -rwxr-xr-x  1 magno magno  172 mar 24 17:35 rfi_lfi.php~
  14. -rw-r--r--  1 magno magno 1309 mar 24 19:48 rfi.pl
  15. -rw-r--r--  1 magno magno 1310 mar 24 19:48 rfi.pl~
  16. TERMINA_AQUI
  17. est</body>
  18. </html>
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Muchas Gracias
magnobalt
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2010-03-24 17:59 @791

Publicidad

Re: Problema con expresión regular

Notapor explorer » 2010-03-24 19:37 @859

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

El problema es que lo que quieres conectar está repartido por varias líneas, así que depende de cómo leas el fichero, tendrás que aplicar distintas expresiones regulares.

Para el caso de leer todo el fichero de golpe, hay que indicar en la expresión regular que la cadena de texto está compuesta de varias líneas, con la opción /s:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my $fichero;
  7.  
  8. open my $FILE, q[<], 'code_21426_3.txt';
  9.  
  10. while (my $linea = <$FILE>) {
  11.     $fichero .= $linea;
  12. }
  13.  
  14. close $FILE;
  15.  
  16. $fichero =~ m/EMPIEZA_AQUI\s*(.*?)\s*TERMINA_AQUI/s;
  17.  
  18. print "$1\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Con los \s* nos deshacemos de los caracteres espacio que no queremos capturar, que lo hacemos con (.*?), que captura todo lo que haya antes de la siguiente etiqueta.

De otra forma, yendo línea a línea, podemos usar el operador rango para extraer las líneas una a una de la parte que nos interesa.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. open my $FILE, q[<], 'code_21426_3.txt';
  7.  
  8. while (<$FILE>) {
  9.  
  10.     if ( /EMPIEZA_AQUI/ .. /TERMINA_AQUI/ ) {
  11.         print if not /AQUI/;                   # pintamos la línea, salvo la primera y última
  12.     }
  13. }
  14.  
  15. close $FILE;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

que es la versión larga de
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. open my $FILE, q[<], 'code_21426_3.txt';
  7.  
  8. my $en_rango;
  9.  
  10. while (<$FILE>) {
  11.  
  12.     if ( /EMPIEZA_AQUI/ ) {
  13.         $en_rango = 1;
  14.         next;
  15.     }
  16.  
  17.     if ( /TERMINA_AQUI/ ) {
  18.         $en_rango = 0;
  19.         next;
  20.     }
  21.  
  22.     if ( $en_rango ) {
  23.         print;
  24.     }
  25. }
  26.  
  27. close $FILE;
  28.  
Coloreado en 0.001 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: Problema con expresión regular

Notapor magnobalt » 2010-03-24 20:49 @909

Buenas, explorer, es increíble la rapidez con lo que contestaste, salí un momento, actualicé la página y ya estaba, y lo mejor es que funciona y bien explicado. Muchas Gracias, Seguiremos en contacto, seguramente.

Saludos
magnobalt
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2010-03-24 17:59 @791

Re: Problema con expresión regular

Notapor erv-Z » 2010-03-26 10:34 @482

Tu expresión puede funcionar: solo elimina lo que te daña tu expresión regular, como puede ser los \n (nueva línea) y los \s (espacios) y seguro funcionará.
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583


Volver a Intermedio

¿Quién está conectado?

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