Foros del Web » Programando para Internet » PHP »

Mal reemplazo de caracteres con str_replace

Estas en el tema de Mal reemplazo de caracteres con str_replace en el foro de PHP en Foros del Web. Hola, Estoy usando una plantila HTML guardada en .tpl. Luego la cargo con PHP, y las string únicas que tengo las sustituyo. Es decir, en ...
  #1 (permalink)  
Antiguo 08/08/2014, 13:02
 
Fecha de Ingreso: julio-2010
Mensajes: 134
Antigüedad: 13 años, 9 meses
Puntos: 0
Mal reemplazo de caracteres con str_replace

Hola,

Estoy usando una plantila HTML guardada en .tpl.
Luego la cargo con PHP, y las string únicas que tengo las sustituyo.

Es decir, en el TPL tengo string del tipo [URL] [USERNAME]
Y luego mediante la función de php str_replace, sustituyo esas cadenas por las adecuadas.

El caso es que de forma aleatorio y cuando le da la gana, hace cosas rarísimas.
Por ejemplo, texto texto constante, por ejemplo una frase que nunca se cambia:
"te ha contestado a:"

Pues cuando le paso el str_replace aparece "te ha contes tado a:"
Me mete espacios donde le da la gana...
Una cosa rarísima, y estoy ya bastante desesperado.

Decir, que he comprobado el cod HTML con dreamweaver y esta bien.
  #2 (permalink)  
Antiguo 08/08/2014, 13:11
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Mal reemplazo de caracteres con str_replace

Nada de lo que dices tienes sustentos, en el manual es muy claro cómo es que funciona str_replace(), pero tal vez es tu mecanismo el que hace los cambios.

Es difícil adivinar que harás mal pero en definitiva no es culpa de str_replace(), es tu culpa.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 08/08/2014, 13:21
 
Fecha de Ingreso: julio-2010
Mensajes: 134
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Mal reemplazo de caracteres con str_replace

Cita:
Iniciado por pateketrueke Ver Mensaje
Nada de lo que dices tienes sustentos, en el manual es muy claro cómo es que funciona str_replace(), pero tal vez es tu mecanismo el que hace los cambios.

Es difícil adivinar que harás mal pero en definitiva no es culpa de str_replace(), es tu culpa.
Seguro?
Pues yo tengo muchas dudas, no paro de hacer comprobaciones, y no tiene nada sentido.

Código PHP:
$message str_replace(array("[url_grupo_cab]","[url_avatar_us]","[url_perfil_user]","[username]","[grupo]","[url_comentario]","[bajagrupo]","[mi_comentario]"),array($cab,$avatar,$msgUserUrl,$msgUserName,$group->get'name'),$url_comentario,$baja_url,$url_reply), $message); 
Esta es la llamada.
Lo UNICO que he conseguido para hacer que funcione es quitando el 2º par de datos.
Es un url que va justo aquí:

Código HTML:
<span style="color: rgb(0, 158, 200);"><a href="[url_perfil_user]" target="_blank" title="" style="color: rgb(0, 158, 200);">[username]</a></span> ha respondido a <span style="text-decoration: underline;"> 
Si lo quito el "respondido" sale tal cual, si la añado me sale "respon dido", como decía.....

Igualmente si cambio la palabra respondido por "contestado" aparece "contes tado".
  #4 (permalink)  
Antiguo 08/08/2014, 13:36
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Mal reemplazo de caracteres con str_replace

No muestres código, muestra datos, el código no lo podemos ejecutar mentalmente para determinar lo que sucede.

Reduce el ejemplo donde te falla str_replace() con datos únicamente.

Es decir, leyendo de pies a cabeza el manual jamás se indican comportamientos extraños para str_replace(), así que de ahí no proviene el problema.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 08/08/2014, 13:45
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Mal reemplazo de caracteres con str_replace

¿Será posible que no hayas tendi en cuenta la advertencia del manual referente a comportamientos especiales, o que no hayas entendido completamente su funcionamiento?
Cita:
Trampa del orden de reemplazo

Debido a que str_replace() reemplaza de izquierda a derecha, podría sustituir a un valor previamente insertado al hacer sustituciones múltiples. (...).
Cita:
Descripción
Código PHP:
Ver original
  1. mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )

Esta función devuelve un string o un array con todas las apariciones de search en subject reemplazadas con el valor dado de replace.

Si no se necesitan reglas complicadas de reemplazo (como expresiones regulares), se puede utilizar siempre esta función en lugar de preg_replace().

Parámetros

Si search y replace son arrays, entonces str_replace() toma un valor de cada array y lo utiliza para buscar y reemplazar en subject. Si replace tiene menos valores que search, entonces un string vacío es usado para el resto de los valores de reemplazo. Si search es un array y replace es un string, entonces este string de reemplazo es usado para cada valor de search. Sin embargo, lo contrario no tendría sentido.

Si search o replace son arrays, sus elementos son procesados del primero al último.

search

El valor a ser buscado, también conocida como la aguja. Un array puede ser utilizado para designar varias agujas.

replace

El valor de reemplazo que sustituye los valores encontrados de search. Un array puede ser utilizado para designar reemplazos múltiples.

subject

El string o array sobre el que se busca y se sustituye, también conocido como el pajar.

Si subject es un array, entonces la búsqueda y reemplazo se realiza con cada entrada de subject y el valor devuelto también es un array.

count

Si es pasado, con este se establece el número de reemplazos realizados.
Normalmente cuando hay errores como los que describes no es un error del lenguaje. O es de datos, o es de entendimiento.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 08/08/2014, 13:53
 
Fecha de Ingreso: julio-2010
Mensajes: 134
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Mal reemplazo de caracteres con str_replace

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿Será posible que no hayas tendi en cuenta la advertencia del manual referente a comportamientos especiales, o que no hayas entendido completamente su funcionamiento?




Normalmente cuando hay errores como los que describes no es un error del lenguaje. O es de datos, o es de entendimiento.
Lo he estado leyendo... pero creo que lo he entendido bien.

Según entiendo, si después de remplazar [url_perfil_user] esa cadena tuviera un [username] podría haber problemas, pero no es asi.
O sea, que sigo sin entender que pasa, además de que tu me diras a son de que le mete un espacio a la palabras.

EDITO: He quitado todos los pares uno a uno, y el único que me da problema es el [url_perfil_user]
EDITO2: Veras tu, que va a ser de la línea esta:
$msgUserUrl = cbSef( 'index.php?option=com_comprofiler&task=userprofile &user=' . (int) $userFrom->id . getCBprofileItemid( false ), false );

es decir la que sustituye a [url_perfil_user]

EDITO:3 He cambiado el string a otro dirección escrita por mi de ejemplo y ya ha fucionado bien. PERO joer... no tiene sentido, por que ese espacio?

Última edición por daicon; 08/08/2014 a las 14:05
  #7 (permalink)  
Antiguo 08/08/2014, 14:30
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Mal reemplazo de caracteres con str_replace

En referencia a la última observación, necesitaríamos hacer una prueba de escritorio analizando los datos en ejecución, al momento de la ejecución.
Sin eso, no hay modo de descubrir en qué paso se "filtra" ese caracter.
No se trata de un error de la función, sino de los datos, y podría presentarse por más de una causa.

Es el tipo de bugs que son un dolor de cabeza para los desarrolladores, porque sólo se presentan en determinados datos, y ciertos contextos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 08/08/2014, 14:46
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Mal reemplazo de caracteres con str_replace

En dado caso podrías mostrarnos el valor real de lo siguiente:
Código PHP:
Ver original
  1. $msgUserUrl = cbSef( 'index.php?option=com_comprofiler&task=userprofile &user=' . (int) $userFrom->id . getCBprofileItemid( false ), false );

¿Qué es lo que devuelve?

Así nos evitamos adivinar.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 10/08/2014, 12:43
 
Fecha de Ingreso: julio-2010
Mensajes: 134
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Mal reemplazo de caracteres con str_replace

Madre mia, perdonad, error gordo mio.

Antes de enviar, pasaba todo el código HTML por esta maldita función, y la verdad es que estaba bien escondida la llamada:

Código PHP:
Ver original
  1. /**
  2.      * Method to be called by another php script. Processes for XSS and specified bad code.
  3.      *
  4.      * @param  mixed  $source  Input string/array-of-string to be 'cleaned'
  5.      * @return mixed  $source  'Cleaned' version of input parameter
  6.      */
  7.     public function process( $source ) {
  8.         if ( is_array( $source ) ) {
  9.             // clean all elements in this array
  10.             foreach ( $source as $key => $value ) {
  11.                 // filter element for XSS and other 'bad' code etc.
  12.                 //BB: if (is_string($value)) $source[$key] = $this->remove($this->decode($value));
  13.                 $source[$key]       =   $this->process( $value );       //BB changed line before with this line to take in account multi-level arrays
  14.             }
  15.             return $source;
  16.         } elseif (is_string( $source ) && ( $source !== '' ) ) {
  17.             // clean this string: Filter source for XSS and other 'bad' code etc:
  18.             return $this->remove( $this->decode( $source ) );
  19.         } else {
  20.             // Not non-empty string or array: return parameter as given:
  21.             return $source;
  22.         }
  23.     }

La pongo por si alguien entiende concretamente que hace, y a que se pudiera deber esos espacios extraños por pura curiosidad.

Por lo demás, nada mas.
Gracias!

Etiquetas: caracteres, html, reemplazo
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 06:13.