Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Como pasar los caracteres +, =

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Sab May 13, 2006 5:16 pm
danimera
Perlero Adicto
Perlero Adicto
Registrado: 23 Jun 2005
Mensajes: 239
Ubicación: Colombia
Como pasar los caracteres +, = Responder citando

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 Confused y no puedo lograrlo. ¿cómo hago esto?
Mensaje Dom May 14, 2006 6:59 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4084
Ubicación: Valladolid, España
Responder citando

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:
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:
    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:
campo1 => rata
nombre => alberto castillo
taghtml => <font color="red">

De todas formas... todo eso ya está hecho en forma de módulos:
Código:
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:
$VAR1 = 'campo1';
$VAR2 = 'rata';
$VAR3 = 'nombre';
$VAR4 = 'alberto castillo';
$VAR5 = 'taghtml';
$VAR6 = '<font color="red">';
Mensaje Dom May 14, 2006 8:20 am
danimera
Perlero Adicto
Perlero Adicto
Registrado: 23 Jun 2005
Mensajes: 239
Ubicación: Colombia
Responder citando

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.
Mensaje Dom May 14, 2006 10:21 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4084
Ubicación: Valladolid, España
Responder citando

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.
Mensaje Dom May 14, 2006 11:18 am
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
Responder citando

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:

use CGI;

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



Saludos
Mensaje Dom May 14, 2006 12:03 pm
danimera
Perlero Adicto
Perlero Adicto
Registrado: 23 Jun 2005
Mensajes: 239
Ubicación: Colombia
Solucionado el problema Responder citando

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.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group