• Publicidad

Como pasar los caracteres +, =

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

Como pasar los caracteres +, =

Notapor danimera » 2006-05-13 18:16 @802

Es un grave problema y no le encuentro solución:

Trabajo con ficheros y no sé cómo hago para pasar los caracteres +, = de los campos de un fomulario, sin que los afecte la lectura de parámetros, más exactamente la partición "split".

ej: campo1=rata&nombre=alberto+castillo&taghtml=<font+color="rojo">

lo que quiero es que el valor de taghtml me pase completo :? y no puedo lograrlo. ¿cómo hago esto?
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Publicidad

Notapor explorer » 2006-05-14 07:59 @374

No acabo de entender el problema.

Si lo que quieres es codificar los valores que extraes de un fichero de texto para pasarlo a un formulario, necesitas pasar esos valores por una función de escapado para convertirlo a un URI:
Código: Seleccionar todo
perl -MURI::Escape -le '$x=q(<font color="red">); print uri_escape($x)' # %3Cfont%20color%3D%22red%22%3E


Si quieres hacer el proceso inverso, leer de ficheros de texto unos URI y parsearlos, puedes intentar hacer algo como esto:
Código: Seleccionar todo
    1 #!/usr/bin/perl -l
    2 use warnings;
    3 use strict;
    4
    5 my $texto = "campo1=rata&nombre=alberto+castillo&taghtml=%3Cfont%20color%3D%22red%22%3E";
    6
    7 my @items = split "&", $texto;
    8 foreach my $item ( @items ) {
    9     my ( $var, $value ) = split "=", $item, 2;
   10
   11     $value =~ s/\+/ /g;
   12     $value =~ s/%(..)/chr(eval "0x$1")/ge;
   13
   14     print "$var => $value";
   15 }
sale
Código: Seleccionar todo
campo1 => rata
nombre => alberto castillo
taghtml => <font color="red">

De todas formas... todo eso ya está hecho en forma de módulos:
Código: Seleccionar todo
use Data::Dumper;
use CGI;
$query = new CGI(qq(campo1=rata&nombre=alberto+castillo&taghtml=%3Cfont%20color%3D%22red%22%3E));
print Dumper $query->Vars;
sale
Código: Seleccionar todo
$VAR1 = 'campo1';
$VAR2 = 'rata';
$VAR3 = 'nombre';
$VAR4 = 'alberto castillo';
$VAR5 = 'taghtml';
$VAR6 = '<font color="red">';
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

Notapor danimera » 2006-05-14 09:20 @430

Aunque más concretamente mi problema es este:

Tengo un formulario HTML y tengo un campo donde las personas escribirán un código en html; lo que quiero es que cuando pase la información de mi formulario por get o post a mi CGI, no me afecte los caracteres +,=, ya que la función split me parte en dos, cada vez que encuentra un =.

Todo porque tengo un editor de esos wysiwyg y quiero grabar en un fichero el código html que provenga de él.
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Notapor explorer » 2006-05-14 11:21 @514

Te aconsejo que uses el módulo CGI ya que, como ves en el segundo ejemplo, lo que recibe desde el formulario es automáticamente convertido al texto original escrito por el usuario.

Si quieres usar el truco del split, fíjate en el primer ejemplo. Primero hacemos un split con el carácter '&' para separar cada uno de los pares etiqueta-valor y luego, por cada uno de esos pares, usamos la función split con un tercer parámetro, que es un '2', para que sólo parta el par por el primer '='. De esa forma no tiene en cuenta el resto de '=' que posiblemente existan en el lado del valor.
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

Notapor kidd » 2006-05-14 12:18 @554

Hola:

Cuando mandas un formulario todos los caracteres especiales son codificados para evitar el tipo de problemas que estás buscando evitar (valga la redundancia). Así que realmente no debes de preocuparte por eso, pues eso es solucionado automáticamente.

Lo que si te recomiendo es que hagas tu envío por medio de POST, para evitar una línea gigantesca en la barra de locación de tus usuarios, y pues del lado de tu cgi que uses el módulo CGI.pm para recibir los datos:

Código: Seleccionar todo
use CGI;

my $query = new CGI;
my %Input = $query->Vars;



Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Solucionado el problema

Notapor danimera » 2006-05-14 13:03 @585

Bueno, lo que me dice explorer lo utilicé y me funcionó genial, en cambio lo de kidd, no, el me codifica todo, pero los iguales '=', me los parte ya lo probé y no pasan. Bueno por el módulo CGI no lo he intentado, puesto se lo estoy aplicando a una aplicación que es con HTML:Template.

Pero gracias a su ayuda, ya solucioné este inconveniente.
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia


Volver a Intermedio

¿Quién está conectado?

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