Foros del Web » Programando para Internet » PHP »

Problema con str_replace

Estas en el tema de Problema con str_replace en el foro de PHP en Foros del Web. Como les va gente, trabajando en un sistema de mensajeria, en la parte del QUOTE, me encuentro trabado en este problema del cual no se ...
  #1 (permalink)  
Antiguo 23/05/2007, 14:37
 
Fecha de Ingreso: diciembre-2004
Ubicación: Cordoba - Argentina
Mensajes: 503
Antigüedad: 19 años, 4 meses
Puntos: 1
Problema con str_replace

Como les va gente, trabajando en un sistema de mensajeria, en la parte del QUOTE, me encuentro trabado en este problema del cual no se como salir.

Cuando al usuario le llega un mensaje este puede o no responderlo, si lo responde en el textarea del mensaje aparecera lo siguiente:

Supongamos que raul nos envio un mensaje y le responderemos.

Cita:
[quotar="RAUL"]che viejo comprame un kilo de bananas que estoy cagado de hambre (MENSAJE AL QUE QUIERO RESPONDER)[/quotar]

Listo Raul, paso por el verdulera y te las llevo!
El codigo php que responde a esta parte:

Código:
if($_POST['res'] == '1') {
     $ncitar = '[citar="' . $_POST['nombre'] . '"]'; 
     $m = $ncitar .$_POST['mensaje']. "[/citar]";
     echo "<textarea name='mensaje'>";
     echo $m;
     echo "</textarea>";
}
Procedemos a guardar el mensaje en la base de datos.

Ahora cuando RAUL entre a su cuenta y se dirija a ver el mensaje la idea es tomar lo que esta entre las comillas de [quotar=""] para poder poner a quien se esta citando pero no tengo idea como hacerlo, lo que yo habia echo es hacerlo sin el nombre de esta forma:

Código:
	
<?
$mensaje = $row['mensaje']; 
$mensaje = str_replace("[quotar]","<div><p><b>Cita:</b></p>",$mensaje);
$mensaje = str_replace("[/quotar]","</div>",$mensaje);
echo $mensaje;
?>
Como puedo arreglarlo??? gracias.
  #2 (permalink)  
Antiguo 23/05/2007, 14:41
 
Fecha de Ingreso: marzo-2007
Mensajes: 347
Antigüedad: 17 años, 1 mes
Puntos: 2
Re: Problema con str_replace (ya casi gano la batalla, nececito un empujon!!)

Lo de cojer el nombre entre comillas con eso no se puede hacer, necesitas expresiones regulares, y eso ya son algo mas complicadas, prueba a buscar en google a ver si aprendes expresiones regulares.

Un saludo
  #3 (permalink)  
Antiguo 23/05/2007, 14:42
Avatar de geq
geq
 
Fecha de Ingreso: agosto-2006
Ubicación: Rosario
Mensajes: 655
Antigüedad: 17 años, 8 meses
Puntos: 22
Re: Problema con str_replace (ya casi gano la batalla, nececito un empujon!!)

deberas usar preg_replace() con una expresion regular qe te permita reemplazar el [quitar="lo qe sea"] tomando lo qe este entre comillas..

busca en php.net sobre esta funcion y sobre las expresiones regulares, hay un monton (yo no puedo entrar, si no te dejaba el link T_T**)

si te lo puedo armar en un munito te lo posteo ^^

exitos
  #4 (permalink)  
Antiguo 23/05/2007, 14:47
Avatar de geq
geq
 
Fecha de Ingreso: agosto-2006
Ubicación: Rosario
Mensajes: 655
Antigüedad: 17 años, 8 meses
Puntos: 22
Re: Problema con str_replace (ya casi gano la batalla, nececito un empujon!!)

ups veo qe algien respondio lo mismo antes qe yo

mira aqui esta
Código PHP:
$mensaje=preg_replace("/\[quotar\=\"(.+)\"\](.*)\[\/quotar\]/si","<div><p><b>\\1 dijo:</b></p>\\2</div>",$mensaje); 
espero qe te sirva ^^

exitos
  #5 (permalink)  
Antiguo 23/05/2007, 15:50
 
Fecha de Ingreso: diciembre-2004
Ubicación: Cordoba - Argentina
Mensajes: 503
Antigüedad: 19 años, 4 meses
Puntos: 1
Re: Problema con str_replace (ya casi gano la batalla, nececito un empujon!!)

Primero que nada muchas gracias, pero me maree, es decir a ese nombre como lo tomo ahora para insertarlo en ( Cita:Raul ) ????

Código:
	
$mensaje = $row['mensaje'];
$mensaje = str_replace("[quotar]","<div><p><b>Citando a NOMBRE:</b></p>",$mensaje);
$mensaje = str_replace("[/quotar]","</div>",$mensaje);
echo $mensaje;
La idea es tomar el nombre del quotado y ponerlo en CITANDO a Nombre.

Seguramente con la expresion de geq se pueda tomarlo y ponerlo en una variable pero no me sale.

gracias.
  #6 (permalink)  
Antiguo 23/05/2007, 16:00
Avatar de geq
geq
 
Fecha de Ingreso: agosto-2006
Ubicación: Rosario
Mensajes: 655
Antigüedad: 17 años, 8 meses
Puntos: 22
Re: Problema con str_replace (ya casi gano la batalla, nececito un empujon!!)

deberias reemplazar estas dos lineas

$mensaje = str_replace("[quotar]","<div><p><b>Citando a NOMBRE:</b></p>",$mensaje);
$mensaje = str_replace("[/quotar]","</div>",$mensaje);

por la mia, devolvera exactamente eso ^^, que puedes modificarlo en el segundo argumento, "<div><p><b>\\1 dijo:</b></p>\\2</div>". \\1 es lo qe esta entre comillas y \\2 lo qe esta entre [quotar...] y [/quotar]

exitos
  #7 (permalink)  
Antiguo 23/05/2007, 16:14
 
Fecha de Ingreso: diciembre-2004
Ubicación: Cordoba - Argentina
Mensajes: 503
Antigüedad: 19 años, 4 meses
Puntos: 1
Re: Problema con str_replace (ya casi gano la batalla, nececito un empujon!!)

Claro, lo habia echo, pero como me devolvio esto:

Cita:
[quotar="Raul"]Compra Frutas.[/quotar] Ok!
Pense que yo estaba haciendo algo mal, tienes idea porque no funciona???
  #8 (permalink)  
Antiguo 23/05/2007, 20:23
Avatar de geq
geq
 
Fecha de Ingreso: agosto-2006
Ubicación: Rosario
Mensajes: 655
Antigüedad: 17 años, 8 meses
Puntos: 22
Re: Problema con str_replace (ya casi gano la batalla, nececito un empujon!!)

esto me funciona bien

Código PHP:
$mensaje="[quotar=\"Raul\"]Compra Frutas.[/quotar] Ok!";
$mensaje=preg_replace("/\[quotar\=\"(.+)\"\](.*)\[\/quotar\]/si","<div><p><b>\\1 

Dijo:</b></p>\\2</div>"
,$mensaje); 
devuelve
Código:
<div><p><b>Raul Dijo:</b></p>Compra Frutas.</div> Ok!
fijate bien, y mira el nombre de las variables tambien ^^

exitos
  #9 (permalink)  
Antiguo 23/05/2007, 20:35
 
Fecha de Ingreso: diciembre-2004
Ubicación: Cordoba - Argentina
Mensajes: 503
Antigüedad: 19 años, 4 meses
Puntos: 1
Re: Problema con str_replace (ya casi gano la batalla, nececito un empujon!!)

Gracias capo!!!! ahora con las \"Raul\" funciona perfectamente, tendre que insertarlo asi en la bd!
  #10 (permalink)  
Antiguo 23/05/2007, 20:46
Avatar de geq
geq
 
Fecha de Ingreso: agosto-2006
Ubicación: Rosario
Mensajes: 655
Antigüedad: 17 años, 8 meses
Puntos: 22
Re: Problema con str_replace (ya casi gano la batalla, nececito un empujon!!)

seria poco practico, pero no deberias tener problema alguno :\
mira esto tambien me funciona bn

Código PHP:
$dblink mysql_connect($dbhost$dbuser$dbpass);
mysql_select_db($dbname);
$result=mysql_query("select texto from mitabla where 1");
$mensaje=mysql_result($result,0,"texto");
//$mensaje="[quotar=\"Raul\"]Compra Frutas.[/quotar] Ok!";
$mensaje=preg_replace("/\[quotar\=\"(.+)\"\](.*)\[\/quotar\]/si","<div><p><b>\\1 Dijo:</b></p>\\2</div>",$mensaje);
echo 
$mensaje
en la base de datos esta almacenado exactamente
Código:
[quotar="Raul"]Compra Frutas.[/quotar] Ok!
puedes verlo en http://201.212.206.30/a.php antes de qe apage mi pc XD
(edit: bueno lo he subido a http://www.cqsoft.com.ar/tests/otroa.php pues ya me estoy yendo)

:\ tal vez el problema sea otro,, si no encuentras nada raro, postea algo de tu codigo aqi, de donde recuperas la informacion de la base de datos, por ejemplo.

exitos

Última edición por geq; 23/05/2007 a las 20:53 Razón: edite!
  #11 (permalink)  
Antiguo 23/05/2007, 22:04
 
Fecha de Ingreso: diciembre-2004
Ubicación: Cordoba - Argentina
Mensajes: 503
Antigüedad: 19 años, 4 meses
Puntos: 1
Re: Problema con str_replace (ya casi gano la batalla, nececito un empujon!!)

Era una linea que remplasaba la comillas cuando insertaba en la base de datos, ahora lo que no tengo la mas palida idea de como resolver, es cuando Pancho asumiendo que es el que le contesto OK a Raul, cuando presione responder para decirle por ejemplo "listo" no figure algo asi en el textarea:

[quotar="Raul"][citar=[/quotar]

Es decir, esto va pasar siempre que halla mas de 1 respuesta, como puedo neutralizarlo¿¿?? para que solo cite al ultimo mensaje que va estar fuera del en el registro de la base de datos.

Gracias y saludos.
  #12 (permalink)  
Antiguo 24/05/2007, 12:51
 
Fecha de Ingreso: diciembre-2004
Ubicación: Cordoba - Argentina
Mensajes: 503
Antigüedad: 19 años, 4 meses
Puntos: 1
Re: Problema con str_replace (ya casi gano la batalla, nececito un empujon!!)

Alguien???¿¿¿¿
  #13 (permalink)  
Antiguo 24/05/2007, 15:33
Avatar de geq
geq
 
Fecha de Ingreso: agosto-2006
Ubicación: Rosario
Mensajes: 655
Antigüedad: 17 años, 8 meses
Puntos: 22
Re: Problema con str_replace (ya casi gano la batalla, nececito un empujon!!)

yo no me doy cuenta,,
fijate qe cuando responda no armar el nuevo mensaje con el ya pasado por preg_replace,,

la verdad qe sin ver el codigo no se me ocurre qe puede estar pasando ^^uu

exitos
  #14 (permalink)  
Antiguo 24/05/2007, 18:21
 
Fecha de Ingreso: diciembre-2004
Ubicación: Cordoba - Argentina
Mensajes: 503
Antigüedad: 19 años, 4 meses
Puntos: 1
Re: Problema con str_replace (ya casi gano la batalla, nececito un empujon!!)

Código:
	

// NOS LLEGA UN PRIVVADO QUE SE TOMA DE LA BD, SI TIENE [CITAR] el PREG_REPLACE SE ENCARGA. MOSTRAMOS EL MENSAJE:

<div>Mensaje</div>
<?
$mensaje = $row['mensaje']; 
$mensaje=preg_replace("/\[citar\=\"(.+)\"\](.*)\[\/citar\]/si","<div ><p><b>\\1 Dijo:</b></p>\\2</div>",$mensaje);
echo $mensaje;
?>
</div>

// SI EL USUARIO PONE RESPONDER MANDAMOS LOS DATOS DEL MENSAJE PARA QUE OTRO ARCHIVO LOS PROCESE

<div>
	<form action="" method="post">
		<input name="go" value="enviar" type="hidden" />
		<input name="admin" value="enviar_mensaje" type="hidden" />
		<input name="id" value="<?=$row['id']?>" type="hidden" />
		<input name="nick" value="<?=$row['nick']?>" type="hidden" />
		<input name="nombre" value="<?=$row['nombre']?>" type="hidden" />
		<input name="asunto" value="<?=$row['asunto']?>" type="hidden" />
		<input name="mensaje" value="<?=$row['mensaje']?>" type="hidden" />
		<input name="res" value="1" type="hidden" />
		<input class="btnpanel" name="responder" type="submit" value="Responder">
	</form>
</div>

//LLEGA AL ARCHIVO DE PROCESAMIENTO Y SI RES ES IGUAL A 1 SIGNIFICA QUE ES UNA RESPUESTA ENTONCES CONFECCIONAMOS EL CITAR CON EL NOMBRE DE LA PERSONA QUE SE ENCUENTRA EN EL $_POST['nombre'] enviado por el formulario anterior.

Se lo ponemos al usuario en el TEXT AREA.

<? 
if($_POST['res'] == '1') {
	$ncitar = '[citar="' . $_POST['nombre'] . '"]'; 
	$m = $ncitar .$_POST['mensaje']. "[/citar]";
	echo "<textarea name='mensaje'>";
	echo $m;
	echo "</textarea>";
} 

El usuario presiona enviar, entonces se guarda en la base de datos.

El problema en si es el siguiente, supongamos que yo respondo un mensaje que me envian, cuando la otra persona quiera responder mi respuesta el preg_replace dejar algo como esto:

Cita:
[citar="Raul"][citar=[/citar]
Cita:
fijate qe cuando responda no armar el nuevo mensaje con el ya pasado por preg_replace,,
Claro, ese es el tema, no se me ocurre como hacer para que no responda el tomado por preg_replace, si remover todo lo que este dentro de [citar="nombre"]dadad[/citar] y hacerle un quote a lo que este afuera de todo eso o directamente si encuentra esos parametros no mostrar ningun [citar] en la respuesta .

Última edición por Snake nS; 24/05/2007 a las 18:41
  #15 (permalink)  
Antiguo 24/05/2007, 20:11
Avatar de geq
geq
 
Fecha de Ingreso: agosto-2006
Ubicación: Rosario
Mensajes: 655
Antigüedad: 17 años, 8 meses
Puntos: 22
Re: Problema con str_replace (ya casi gano la batalla, nececito un empujon!!)

ooh ya entendi
es un problema del patron

estube probandolo y creo qe deberas dos:
Código PHP:
$mensaje=preg_replace("/\[quotar\=\"(.*?)\"\]/si","<div><p><b>\\1 Dijo:</b></p>",$mensaje);
$mensaje=preg_replace("/\[\/quotar\]/si","</div>",$mensaje); 
asi reemplazas todos los [quotar] y luego los [/quotar], pues si estan anidados lo maximo qe pude hacer es qe reemplaze una vez, y qedaba el de adentro sin reemplazar,, me gustaria saber si se puede hacer qe se reemplacen todos si es qe se puede y algien sabe :D

espero qe te sirva
exitos
  #16 (permalink)  
Antiguo 24/05/2007, 21:00
 
Fecha de Ingreso: diciembre-2004
Ubicación: Cordoba - Argentina
Mensajes: 503
Antigüedad: 19 años, 4 meses
Puntos: 1
Re: Problema con str_replace (ya casi gano la batalla, nececito un empujon!!)

Pasa lo mismo, el problema se debe a que yo en el $_POST le estoy mandando el $row['mensaje'] que es el que no esta modificado por el preg_replace ya que si enviara el modificado seria no practico porque haria una insercion del codigo HTML, pero seguramente funcionaria.

Aca te confeccione un ejemplo para que ejecutes y entiendas lo que digo:

Código:
<?
if ($_POST['responder']){
	$ncitar = '[citar="' . $_POST['nombre'] . '"]'; 
	$m = $ncitar .$_POST['mensaje']. "[/citar]";
	echo "<textarea name='mensaje' cols='52' rows='7'>";
	echo $m;
	echo "</textarea>";
} else {
	$mensaje="[citar=\"Raul\"]Compra Frutas.[/citar] Ok!"; 
	$mensaje=preg_replace("/\[citar\=\"(.*?)\"\]/si","<div><p><b>\\1 Dijo:</b></p>",$mensaje);
	$mensaje=preg_replace("/\[\/citar\]/si","</div>",$mensaje);
	echo $mensaje;
	//TE PREGUNTARAS PORQUE LA IGUALO AL PRIMER VALOR, ES DEBIDO A QUE ESTA LINEA TENDREMOS GUARDADA EN LA BD YA QUE NO GUARDAMOS EL CODIGO GENERADO POR PRE_REPLACE YA QUE SERIA NO PRACTICO POR EL CODIGO HTML GENERADO.
	$mensaje="[citar=\"Raul\"]Compra Frutas.[/citar] Ok!";
}
?>

<form action="" method="post">
	<input name="mensaje" value="<?=$mensaje?>" type="hidden" />
	<input name="nombre" value="Cintia" type="hidden" />
	<input class="btnpanel" name="responder" type="submit" value="Responder">
</form>
Saludos y muchas gracias.
  #17 (permalink)  
Antiguo 24/05/2007, 22:22
Avatar de geq
geq
 
Fecha de Ingreso: agosto-2006
Ubicación: Rosario
Mensajes: 655
Antigüedad: 17 años, 8 meses
Puntos: 22
Re: Problema con str_replace (ya casi gano la batalla, nececito un empujon!!)

aah ya vi por qe puede ser
fijate qe el valor del mensaje te qeda

value="[citar="Raul"]Compra Frutas.[/citar] Ok!"

un lio de comillas,, a tu script solo llega "[citar=" como mensaje

yo te diria qe cuando vayan a responder, vuelva a tomar el mensaje de la base de datos para armar el texto de la respuesta,,

exitos
  #18 (permalink)  
Antiguo 25/05/2007, 01:34
 
Fecha de Ingreso: diciembre-2004
Ubicación: Cordoba - Argentina
Mensajes: 503
Antigüedad: 19 años, 4 meses
Puntos: 1
Re: Problema con str_replace (ya casi gano la batalla, nececito un empujon!!)

Gracias maestro!! ahora anda perfectamente, lo unico que me resta por preguntarte es si hay alguna forma de hacer una validacion estricta para comprabar que de haber un [citar] este perfectamente escrito para que el preg_replace no cometa errores.

Saludos y muchas gracias.
  #19 (permalink)  
Antiguo 25/05/2007, 12:42
Avatar de geq
geq
 
Fecha de Ingreso: agosto-2006
Ubicación: Rosario
Mensajes: 655
Antigüedad: 17 años, 8 meses
Puntos: 22
Re: Problema con str_replace (ya casi gano la batalla, nececito un empujon!!)

mira yo te puedo dar est

Código PHP:
preg_match("/\[quotar\=\"(.*?)\"\](.+)\[\/quotar\]/",$mensaje
qe dara false si no esta completo el o true si esta bien

pero no funciona bien cuando estan anidados, es decir hay varios quotar uno dentro del otro

a ver algien qe lo complete ^^??

exitos
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 13:49.