Foros del Web » Programando para Internet » PHP »

Procesar cadena de caracteres

Estas en el tema de Procesar cadena de caracteres en el foro de PHP en Foros del Web. Hola, pues bien, resulta que tengo una función que recibe una cadena y debería transformarla en algo de este tipo mas o menos: Si recibo ...
  #1 (permalink)  
Antiguo 10/08/2006, 13:58
Avatar de KarenFerreira  
Fecha de Ingreso: abril-2005
Ubicación: Bucaramanga, Colombia
Mensajes: 87
Antigüedad: 19 años
Puntos: 2
Pregunta Procesar cadena de caracteres

Hola, pues bien, resulta que tengo una función que recibe una cadena y debería transformarla en algo de este tipo mas o menos:

Si recibo "pensión"
debería quedar: "p[eéèêëEÉÈÊË]ns"[iíïîìIÍÏÎÌ][oóôöòOÓÔÖÒ]n",

esto con el fin de enviarla a una consulta postgre sql y hacer una comparacion con "similar to", el caso es que no esta haciendo lo que debería porque cuando le digo pensión y muestro la variable para ver si la recibió bien, efectivamente me muestra

"pensión"

pero cuando empiezo a separar la cadena caracter por caracter para reemplazarlos por las cadenas correspondientes a las vocales, entonces me sale

"p e n s i ? ? n"

y cuando vuelve a unir mi cadena y le digo que la muestre en pantalla para saber como se ve, entonces me muestra

"p[e����E����]ns[i����I����]ón"

lo cual es extraño porque aparte de no modificarme la o, la toma como dos caracteres por separado y los caracteres que vienen tildados de diferentes formas dentro de mis cadenas de reemplazo, se cambian por interrogantes. La función que estoy utilizando es la siguiente:

Código PHP:

function tildes($varparam)
{
    
$res "";
    for(
$i=0$i<strlen($varparam); $i++)
    {
        
$cur substr($varparam$i1);
        if(
$cur=="e"||$cur=="é"||$cur=="è"||$cur=="ê"||$cur=="ë"||$cur=="E"||$cur=="É"||$cur=="È"||$cur=="Ê"||$cur=="Ë")
          
$res $res."[eéèêëEÉÈÊË]";
        else
        if (
$cur=="a"||$cur=="á"||$cur=="à"||$cur=="â"||$cur=="ä"||$cur=="A"||$cur=="Á"||$cur=="À"||$cur=="Â"||$cur=="Ä")
            
$res $res."[aáàâäAÁÀÂÄ]";
        else
        if (
$cur=="i"||$cur=="í"||$cur=="ì"||$cur=="ï"||$cur=="î"||$cur=="I"||$cur=="Í"||$cur=="Ì"||$cur=="Ï"||$cur=="Î")
            
$res $res."[iíïîìIÍÏÎÌ]";
        else
        if (
$cur=="o"||$cur=="&oacute;"||$cur=="ô"||$cur=="ö"||$cur=="ò"||$cur=="O"||$cur=="Ó"||$cur=="Ô"||$cur=="Ö"||$cur=="Ò")
            
$res $res."[oóôöòOÓÔÖÒ]";
        else
        if (
$cur=="u"||$cur=="ú"||$cur=="ù"||$cur=="û"||$cur=="ü"||$cur=="U"||$cur=="Ú"||$cur=="Ù"||$cur=="Û"||$cur=="Ü")
            
$res $res."[uúûüùUÚÛÜÙ]";
        else
        if (
$cur=="c"||$cur=="ç"||$cur=="C"||$cur=="Ç")
            
$res $res."[cCçÇ]";
        else
            
$res $res.$cur;
    }

    return 
$res;

no tengo ni la más mínima idea de a que cosa puedo atribuirle ese cambio tan extraño, alguien tiene alguna idea de eso?
__________________
'Esto va a salir mal de todos modos, asi que no vale la pena estresarse por eso.' Tony Kakko.
  #2 (permalink)  
Antiguo 10/08/2006, 15:12
Avatar de Erikfrancisco  
Fecha de Ingreso: noviembre-2003
Ubicación: Estado de México
Mensajes: 503
Antigüedad: 20 años, 5 meses
Puntos: 4
bueno pues lo que ahorita se me ocurre es que utilices la función str_replace de esta manera para no tener que hacer todo este código:

<?php
$pajar = 'lo que tú quieras';
$aguja = array ('a', 'e', 'i', 'o', 'u');
$nuevaaguja = array ('[aáàâäAÁÀÂÄ]', '[eéèêëEÉÈÊË]', '[iíïîìIÍÏÎÌ]', '[oóôöòOÓÔÖÒ]', '[uúûüùUÚÛÜÙ]' );
echo str_replace ( $aguja, $nuevaaguja, $pajar );
?>

a me falto la letra 'c' sólo agregala a los array aguja y nuevaaguja. Espero te sirva de algo.
  #3 (permalink)  
Antiguo 10/08/2006, 15:49
foo
 
Fecha de Ingreso: febrero-2006
Mensajes: 278
Antigüedad: 18 años, 2 meses
Puntos: 0
Cita:
Iniciado por KarenFerreira Ver Mensaje
Hola, pues bien, resulta que tengo una función que recibe una cadena y debería transformarla en algo de este tipo mas o menos:

Si recibo "pensión"
debería quedar: "p[eéèêëEÉÈÊË]ns"[iíïîìIÍÏÎÌ][oóôöòOÓÔÖÒ]n",
que intentas hacer con eso? si lo que quieres hacer es comparar textos sin importar las tildes, puedes usar la funcion to_ascii para eso.
Código:
SELECT * FROM tabla WHERE to_ascii(campo) = to_ascii('pensión');
Cita:
Iniciado por KarenFerreira Ver Mensaje
esto con el fin de enviarla a una consulta postgre sql y hacer una comparacion con "similar to", el caso es que no esta haciendo lo que debería porque cuando le digo pensión y muestro la variable para ver si la recibió bien, efectivamente me muestra

"pensión"

pero cuando empiezo a separar la cadena caracter por caracter para reemplazarlos por las cadenas correspondientes a las vocales, entonces me sale

"p e n s i ? ? n"

y cuando vuelve a unir mi cadena y le digo que la muestre en pantalla para saber como se ve, entonces me muestra

"p[e����E����]ns[i����I����]ón"

lo cual es extraño porque aparte de no modificarme la o, la toma como dos caracteres por separado y los caracteres que vienen tildados de diferentes formas dentro de mis cadenas de reemplazo, se cambian por interrogantes. La función que estoy utilizando es la siguiente:
no hace lo que deberia porque seguramente estas haciendo algo mal, debes tener en cuenta que el encoding del cliente y servidor deben ser el mismo para evitar este tipo de cosas.

te sugiero que de vez en cuando leas la documentacion...
  #4 (permalink)  
Antiguo 10/08/2006, 16:01
Avatar de DarkXNightmare  
Fecha de Ingreso: agosto-2005
Ubicación: Somewhere Over The Rainbo
Mensajes: 181
Antigüedad: 18 años, 8 meses
Puntos: 0
Configura el navegador Web y aplicación que estas usando para visualizar caracteres especialies ¬¬...

Atte... DarkXNightmare ;D.
__________________
Cambiando mi Web... sean pacientes :P
  #5 (permalink)  
Antiguo 10/08/2006, 16:17
Avatar de KarenFerreira  
Fecha de Ingreso: abril-2005
Ubicación: Bucaramanga, Colombia
Mensajes: 87
Antigüedad: 19 años
Puntos: 2
No viene al caso lo que me dices foo, mi problema en realidad no es que no sepa como reemplazar los caracteres, sino que no se como rayos esta interpretando apache o php (eso no lo sé) mi cadena de caracteres y porque cuando quiero dividirla en caracteres individuales me convierte los caracteres con tilde "dos ? " porque mi problema en realidad son las palabras que recibo que vienen previamente tildadas, y la secuencia de caracteres especiales por la que quiero reemplazar las vocales de mi cadena, porque todo lo que viene con ´, ¨, ^,` termina volviendose un ?? y sigo sin entender el porque... por cierto, ya habia probado to_ascii y no me sirve para hacer lo que necesito
__________________
'Esto va a salir mal de todos modos, asi que no vale la pena estresarse por eso.' Tony Kakko.
  #6 (permalink)  
Antiguo 10/08/2006, 16:22
Avatar de DarkXNightmare  
Fecha de Ingreso: agosto-2005
Ubicación: Somewhere Over The Rainbo
Mensajes: 181
Antigüedad: 18 años, 8 meses
Puntos: 0
¿Podrías mandar el Script para ver la función y como la estas aplicando?
De esa manera podremos ayudarte más :P.

Atte... DarkXNightmare ;D.
__________________
Cambiando mi Web... sean pacientes :P
  #7 (permalink)  
Antiguo 10/08/2006, 16:37
foo
 
Fecha de Ingreso: febrero-2006
Mensajes: 278
Antigüedad: 18 años, 2 meses
Puntos: 0
haz lo que te comenta DarkXNightmare o en todo caso explica lo que realmente quieres hacer en postgresql, talvez haya una solucion alterna...
  #8 (permalink)  
Antiguo 10/08/2006, 19:47
 
Fecha de Ingreso: agosto-2006
Ubicación: Madrid
Mensajes: 95
Antigüedad: 17 años, 8 meses
Puntos: 0
mira cómo está codificado tu archivo, si está en iso-8859-1 o en UTF-8. Si está en UTF, ahí tienes el problema
  #9 (permalink)  
Antiguo 15/08/2006, 07:40
Avatar de KarenFerreira  
Fecha de Ingreso: abril-2005
Ubicación: Bucaramanga, Colombia
Mensajes: 87
Antigüedad: 19 años
Puntos: 2
Busqueda Respondiendome a mi misma

Bueno, pues despues de unos días... tal vez muchos, encontre una solución a mi problema, Nigel tenía razón, el meollo estaba en la codificación de los archivos, asi que hice lo siguiente:

Código PHP:
//esta es la función que tenía al principio
function tildes($varparam)
{
    
$res "";
/*pero aca le agregué dos lineas adicionales para pasar los caracteres de UTF-8 a codificación ISO*/
    
    
$varparam2 utf8_decode($varparam);
    
$varparam $varparam2;

/*luego sigo con el procedimiento normal, aunque tambien agregué la ñ al proceso*/

    
for($i=0$i<strlen($varparam); $i++)
    {
        
$cur substr($varparam$i1);
        if(
$cur=="e"||$cur=="é"||$cur=="è"||$cur=="ê"||$cur=="ë"||$cur=="E"||$cur=="É"||$cur=="È"||$cur=="Ê"||$cur=="Ë")
          
$res $res."[eéèêëEÉÈÊË]";
        else
        if (
$cur=="a"||$cur=="á"||$cur=="à"||$cur=="â"||$cur=="ä"||$cur=="A"||$cur=="Á"||$cur=="À"||$cur=="Â"||$cur=="Ä")
            
$res $res."[aáàâäAÁÀÂÄ]";
        else
        if (
$cur=="i"||$cur=="í"||$cur=="ì"||$cur=="ï"||$cur=="î"||$cur=="I"||$cur=="Í"||$cur=="Ì"||$cur=="Ï"||$cur=="Î")
            
$res $res."[iíïîìIÍÏÎÌ]";
        else
        if (
$cur=="o"||$cur=="&oacute;"||$cur=="ô"||$cur=="ö"||$cur=="ò"||$cur=="O"||$cur=="Ó"||$cur=="Ô"||$cur=="Ö"||$cur=="Ò")
            
$res $res."[oóôöòOÓÔÖÒ]";
        else
        if (
$cur=="u"||$cur=="ú"||$cur=="ù"||$cur=="û"||$cur=="ü"||$cur=="U"||$cur=="Ú"||$cur=="Ù"||$cur=="Û"||$cur=="Ü")
            
$res $res."[uúûüùUÚÛÜÙ]";
        else
        if (
$cur=="c"||$cur=="ç"||$cur=="C"||$cur=="Ç")
            
$res $res."[cCçÇ]";
        else if (
$cur=="Ñ"||$cur=="ñ")
            
$res $res."[Ññ]";
        else
            
$res $res.$cur;
    }

    return 
$res;

Luego verifique que la codificación del archivo fuera ISO y listo, problema solucionado, gracias a todos por sus aportes.
__________________
'Esto va a salir mal de todos modos, asi que no vale la pena estresarse por eso.' Tony Kakko.
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 16:56.