Foros del Web » Programando para Internet » Javascript »

Problema al procesar string

Estas en el tema de Problema al procesar string en el foro de Javascript en Foros del Web. Hola gente de Foros del Web... tengo el siguiente problema con una pagina que estoy creando... Tengo un formulario donde recojo los datos y los ...
  #1 (permalink)  
Antiguo 05/04/2012, 18:35
Avatar de Jemonge  
Fecha de Ingreso: enero-2011
Mensajes: 28
Antigüedad: 13 años, 3 meses
Puntos: 0
Pregunta Problema al procesar string

Hola gente de Foros del Web... tengo el siguiente problema con una pagina que estoy creando...

Tengo un formulario donde recojo los datos y los envío a travez de ajax aplicandoles la función encodeURIComponent() para permitir enviar los acentos y la ñ...

Por ejemplo la palabra: Música

Por el momento todo está bien...

El problema lo tengo al recibirlos en el archivo PHP, éste recoge los valores que el usuario ingresó y tiene que dejar solo letras, números, acentos y la ñ, todas las demás letras borrarlas, para eso uso lo siguiente:

Código PHP:
$variablepreg_replace("/[^a-z ñÑáéíóúÁÉÍÓÚ]/i"""$variable); 
Pero el problema es que me borra de la variable todas las letras con acentos y eñes, no se que puede ser...

La palabra devería quedar igual, pero queda así: Msica

Estuve investigando y al parecer encodeURIComponent() convierte los acentos a hexadecimal pero no encuentro alguna solución, espero me puedan ayudar...
  #2 (permalink)  
Antiguo 05/04/2012, 19:00
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Problema al procesar string

¡buenas!
el problema corresponde más bien en php. encodeURIComponent escapa algunos caracteres en utf-8 y respresentados en hexadecimal. por ejemplo, la eñe la convierte en %c3%b1. no tengo claro si php automaticamente convierte la combinación escapada a caracteres legibles. de modo que la secuencia anterior en iso-8859-1 es ñ. como verás, el texto está codificado en utf-8 y php trabaja los string de forma nativa en iso-8859-1. por tanto, la expresiones regulares de php trabajan sobre el charset nativo. no se cuál sería la mejor forma, si convertir el string de utf-8 a iso-8859-1 y luego hacer el reemplazo, o si existe alguna otra forma de indicarle a las expresiones regulares el charset a utilizar. por supuesto, todo esto en php.

te recomiendo que revises la documentación de php y que solicites que muevan el tema al foro php.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #3 (permalink)  
Antiguo 05/04/2012, 19:11
 
Fecha de Ingreso: abril-2012
Mensajes: 1
Antigüedad: 12 años
Puntos: 1
Respuesta: Problema al procesar string

Buenas, a una mala siempre puedes hacer un strtr de php.

Según la api de php

Si se dan tres argumentos, esta función devuelve una copia de str donde todas las apariciones de cada caracter (byte simple) en from ha sido traducido al caracter correspondiente en to es decir, todas las apariciones de $from[$n] han sido reemplazadas con $to[$n], donde $n es un desplazamiento válido en ambos argumentos.

Si from y to tienen distinta logitud, se ignoran los caracteres extra del string más largo. La longitud de str será la misma que la del valor devuelto.

Si se dan dos argumentos, el segundo debe ser un array en la forma de array('from' => 'to', ...). El valor devuelto es un string donde todas las apariciones de las claves del array han sido reemplazadas por los valores correspondientes. Las claves más largas se intentarán primero. Una vez una substring ha sido reemplazada, su nuevo valor no será buscado de nuevo.

En este caso, las claves y los valores pueden tener cualquier longitud, siempre que no haya llaves vacías; adicionalmente, la longitud del valor devuelto puede diferir de la de str. Sin embargo, esta función será la más eficiente cuando todas las claves tienen el mismo tamaño.




Código PHP:
$cadena =strtr($cadena"áéíóú ""aeiou"); 
Así, si $cadena valiera "camión", tras pasar el strtr valdrá "camion". De esta manera puedes cargarte los caracteres raros antes de hacer el replace.
  #4 (permalink)  
Antiguo 05/04/2012, 19:14
Avatar de Jemonge  
Fecha de Ingreso: enero-2011
Mensajes: 28
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Problema al procesar string

Gracias zerokilled por responder...

Hice lo que me sugeriste de convertir la cadena de ISO-8859-1 a UTF-8 utilizando la siguiente funcion:

Código PHP:
$variable mb_convert_encoding($variable"ISO-8859-1""UTF-8"); 
Y ahora me muestra: M�sica
  #5 (permalink)  
Antiguo 05/04/2012, 19:19
Avatar de Jemonge  
Fecha de Ingreso: enero-2011
Mensajes: 28
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Problema al procesar string

Cita:
Iniciado por Luis_P Ver Mensaje
Buenas, a una mala siempre puedes hacer un strtr de php.

Según la api de php

Si se dan tres argumentos, esta función devuelve una copia de str donde todas las apariciones de cada caracter (byte simple) en from ha sido traducido al caracter correspondiente en to es decir, todas las apariciones de $from[$n] han sido reemplazadas con $to[$n], donde $n es un desplazamiento válido en ambos argumentos.

Si from y to tienen distinta logitud, se ignoran los caracteres extra del string más largo. La longitud de str será la misma que la del valor devuelto.

Si se dan dos argumentos, el segundo debe ser un array en la forma de array('from' => 'to', ...). El valor devuelto es un string donde todas las apariciones de las claves del array han sido reemplazadas por los valores correspondientes. Las claves más largas se intentarán primero. Una vez una substring ha sido reemplazada, su nuevo valor no será buscado de nuevo.

En este caso, las claves y los valores pueden tener cualquier longitud, siempre que no haya llaves vacías; adicionalmente, la longitud del valor devuelto puede diferir de la de str. Sin embargo, esta función será la más eficiente cuando todas las claves tienen el mismo tamaño.




Código PHP:
$cadena =strtr($cadena"áéíóú ""aeiou"); 
Así, si $cadena valiera "camión", tras pasar el strtr valdrá "camion". De esta manera puedes cargarte los caracteres raros antes de hacer el replace.

Hola Luis_P...

El problema con realizar lo que me dices es que perdería los acentos y yo quiero que se mantengan... seguir conservando "camión".

Aún así gracias por responder... :)
  #6 (permalink)  
Antiguo 05/04/2012, 21:55
Avatar de elarrieux  
Fecha de Ingreso: abril-2012
Ubicación: Uruguay
Mensajes: 67
Antigüedad: 12 años
Puntos: 26
Respuesta: Problema al procesar string

Hola!

Que content-type estas usando en la pagina?

Sds.
  #7 (permalink)  
Antiguo 07/04/2012, 06:23
Avatar de Jemonge  
Fecha de Ingreso: enero-2011
Mensajes: 28
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Problema al procesar string

Cita:
Iniciado por elarrieux Ver Mensaje
Hola!

Que content-type estas usando en la pagina?

Sds.
Hola elarrieux, estoy utilizando este:

Código HTML:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
  #8 (permalink)  
Antiguo 07/04/2012, 13:36
Avatar de elarrieux  
Fecha de Ingreso: abril-2012
Ubicación: Uruguay
Mensajes: 67
Antigüedad: 12 años
Puntos: 26
Respuesta: Problema al procesar string

Proba a cambiarlo por:

Código HTML:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
Y no hagas ninguna conversion. Ahi te deberian aparecer los tildes.

Sds.
  #9 (permalink)  
Antiguo 07/04/2012, 18:01
Avatar de Jemonge  
Fecha de Ingreso: enero-2011
Mensajes: 28
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Problema al procesar string

Cita:
Iniciado por elarrieux Ver Mensaje
Proba a cambiarlo por:

Código HTML:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
Y no hagas ninguna conversion. Ahi te deberian aparecer los tildes.

Sds.
Gracias por responder elarrieux

Hice lo que dijiste de cambiar el charset y quitar la conversión pero aún sigue sin funcionarme....

Escribiendo Música obtengo Msica
  #10 (permalink)  
Antiguo 07/04/2012, 20:52
Avatar de elarrieux  
Fecha de Ingreso: abril-2012
Ubicación: Uruguay
Mensajes: 67
Antigüedad: 12 años
Puntos: 26
Respuesta: Problema al procesar string

Podremos ver el codigo?

Estas haciendo alguna conversion en la llamada al ajax? Asignando content type al ajax?

Sds.
  #11 (permalink)  
Antiguo 08/04/2012, 14:33
Avatar de Jemonge  
Fecha de Ingreso: enero-2011
Mensajes: 28
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Problema al procesar string

Cita:
Iniciado por elarrieux Ver Mensaje
Podremos ver el codigo?

Estas haciendo alguna conversion en la llamada al ajax? Asignando content type al ajax?

Sds.
Ok, estos son los archivos que utilizo:


Index.html

Código HTML:
Ver original
  1. <!DOCTYPE html>
  2.  
  3. <html lang="es">
  4.     <head>
  5.         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  6.         <script src="http://code.jquery.com/jquery-1.7.2.min.js" type="text/javascript"></script>
  7.         <script type="text/javascript" src="acciones.js"></script>
  8.     </head>
  9.  
  10.     <body style="text-align: center;">
  11.         <div style="text-align: left; width: 500px; margin: 0 auto;">
  12.             <form action="" method="post" accept-charset="UTF-8" name="postedit">
  13.                 <div style="float:left; color:#0D7200; font-weight: bold; margin-bottom:3px;">
  14.                     <div style="display:inline-block; margin-left:5px;">
  15.                         Categoria:
  16.                     </div>
  17.                     <div style="display:inline-block; margin-left:5px;">
  18.                         <input id="EditCategoria" class="inputPublicar" style="height: 20px; margin-left: -5px;" type="text" maxlength="25" value="Música">
  19.                     </div>
  20.                 </div>
  21.                 <div id="focusEditar">
  22.                     <input class="login" type="submit" style="float:right;" name="postEdit" id="postEdit" value="Guardar" onclick="return Guardar(this.form.EditCategoria.value);" tabindex="2">
  23.                 </div>
  24.             </form>
  25.         </div>
  26.     </body>
  27. </html>


acciones.js

Código Javascript:
Ver original
  1. function Guardar(categoria)
  2. {
  3.     if(categoria == "")
  4.     {
  5.         alert("Ingresa una categoria");
  6.  
  7.         return false;
  8.     }
  9.     else
  10.     {
  11.         $.ajax({
  12.        
  13.             type: 'POST',
  14.             url: 'http://localhost/pagina/Guardar.php',
  15.             data: 'categoria='+ encodeURIComponent(categoria),
  16.  
  17.             success: function(h){
  18.                 $("#EditCategoria").val(h);
  19.             },
  20.  
  21.             error: function(){
  22.                
  23.             }
  24.         });
  25.         return false;
  26.     }
  27. }


Guardar.php

Código PHP:
Ver original
  1. <?php
  2.  
  3.         $categoria = $_POST['categoria'];
  4.         //Limpiar
  5.         $categoria = preg_replace("/[^a-z ñáéíóú]/i", "", $categoria);
  6.        
  7.         echo $categoria." *";
  8. ?>
  #12 (permalink)  
Antiguo 09/04/2012, 18:47
Avatar de elarrieux  
Fecha de Ingreso: abril-2012
Ubicación: Uruguay
Mensajes: 67
Antigüedad: 12 años
Puntos: 26
Respuesta: Problema al procesar string

Probalo asi, a mi me funciono:

Index.html

Código PHP:
<!DOCTYPE html>
 
<
html lang="es">
    <
head>
<
meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"
        <
script src="http://code.jquery.com/jquery-1.7.2.min.js" type="text/javascript"></script>
        <script type="text/javascript" src="acciones.js"></script>
    </head>
 
    <body style="text-align: center;">
        <div style="text-align: left; width: 500px; margin: 0 auto;">
            <form action="" method="post" name="postedit">
                <div style="float:left; color:#0D7200; font-weight: bold; margin-bottom:3px;">
                    <div style="display:inline-block; margin-left:5px;">
                        Categoria:
                    </div>
                    <div style="display:inline-block; margin-left:5px;">
                        <input id="EditCategoria" class="inputPublicar" style="height: 20px; margin-left: -5px;" type="text" maxlength="25" value="Música">
                    </div>
                </div>
                <div id="focusEditar">
                    <input class="login" type="submit" style="float:right;" name="postEdit" id="postEdit" value="Guardar" onclick="return Guardar(this.form.EditCategoria.value);" tabindex="2">
                </div>
            </form>
        </div>
    </body>
</html> 
acciones.js

Sin cambios

guardar.php

Código PHP:
<?php
 
        $categoria 
$_POST['categoria'];
        
//Limpiar 
        //$categoria = preg_replace("/[^a-z ñáéíóú]/i", "", $categoria); 
        
        
echo $categoria." *";
?>
Sds.
  #13 (permalink)  
Antiguo 11/04/2012, 08:31
Avatar de Jemonge  
Fecha de Ingreso: enero-2011
Mensajes: 28
Antigüedad: 13 años, 3 meses
Puntos: 0
Pregunta Respuesta: Problema al procesar string

Cita:
Iniciado por elarrieux Ver Mensaje
Probalo asi, a mi me funciono:

Index.html

Código PHP:
<!DOCTYPE html>
 
<
html lang="es">
    <
head>
<
meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"
        <
script src="http://code.jquery.com/jquery-1.7.2.min.js" type="text/javascript"></script>
        <script type="text/javascript" src="acciones.js"></script>
    </head>
 
    <body style="text-align: center;">
        <div style="text-align: left; width: 500px; margin: 0 auto;">
            <form action="" method="post" name="postedit">
                <div style="float:left; color:#0D7200; font-weight: bold; margin-bottom:3px;">
                    <div style="display:inline-block; margin-left:5px;">
                        Categoria:
                    </div>
                    <div style="display:inline-block; margin-left:5px;">
                        <input id="EditCategoria" class="inputPublicar" style="height: 20px; margin-left: -5px;" type="text" maxlength="25" value="Música">
                    </div>
                </div>
                <div id="focusEditar">
                    <input class="login" type="submit" style="float:right;" name="postEdit" id="postEdit" value="Guardar" onclick="return Guardar(this.form.EditCategoria.value);" tabindex="2">
                </div>
            </form>
        </div>
    </body>
</html> 
acciones.js

Sin cambios

guardar.php

Código PHP:
<?php
 
        $categoria 
$_POST['categoria'];
        
//Limpiar 
        //$categoria = preg_replace("/[^a-z ñáéíóú]/i", "", $categoria); 
        
        
echo $categoria." *";
?>
Sds.
Gracias por responder elarrieux

Si ejecuto el código que colocaste en efecto me mantienen las tildes

... el problema es que no me elimina los caracteres que no quiero, por ejemplo si escribo "Música>" debería devolver "Música" pero vuelve a devolver "Música>"

Gracias de nuevo...
  #14 (permalink)  
Antiguo 11/04/2012, 10:19
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Problema al procesar string

@jemonge, tal como te comente... el tema va más por el lado de servidor y estas discutiendo en un foro front-end. en todo caso, si tu documento está codificado en utf-8 (así pareces indicarlo en temas anteriores), creo que parte del problema es que PCRE ve la expresión como bytes individuales. por ejemplo, la "ñ" en utf-8 está compuesto de dos bytes, C3 B1. así sucesivamente con las demás vocales acentuadas. cuando php recibe el parámetro, lo recibe en utf-8 porque encodeURIComponent codifica el contenido en utf-8. utiliza el modificador "u" para PCRE el cual le indica que el patrón está en utf-8. supongo que con eso evita que PCRE vea el patrón como bytes individuales. es decir '/patron/u'. aca un ejemplo funcionando, http://phpscripting.awardspace.us/
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Etiquetas: ajax, decodificar, strings
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:18.