Foros del Web » Programando para Internet » PHP »

Sistema de Quotes #Post

Estas en el tema de Sistema de Quotes #Post en el foro de PHP en Foros del Web. Hola! Estoy haciendo el típico sistema de quotear el número del post o mensaje de la noticia o thread que estás viendo. Estoy haciendo pruebas ...
  #1 (permalink)  
Antiguo 07/09/2011, 09:23
 
Fecha de Ingreso: julio-2011
Mensajes: 22
Antigüedad: 12 años, 9 meses
Puntos: 2
Sistema de Quotes #Post

Hola!

Estoy haciendo el típico sistema de quotear el número del post o mensaje de la noticia o thread que estás viendo. Estoy haciendo pruebas y tal, y con un solo #Post me funciona perfectamente, pero no tengo claro como hacerlo para que vaya buscando.

Pongo un ejemplo para que se entienda mejor:

Código:
# Buscamos ahora etiquetas "#" para quotear
$array = explode("#", $string);
$array2 = explode(" ", $array[1]);
$string2 = $array2[0];
for ($i=0; $i<strlen($string2); $i++) {
	if (is_numeric($string2[$i])) {
		$string3.=$string2[$i];
	}
}
Eso solo me devuelve 1, pero si por ej el mensaje que estoy analizando tiene "BIBAH #1 y #1337" tan solo me saldría el primero. Como puedo enfocar el bucle para ir analizando uno a uno las concordancias.

Un saludo :D y gracias de antebraso
  #2 (permalink)  
Antiguo 07/09/2011, 09:52
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Sistema de Quotes #Post

¿Sabes manejar expresiones regulares?

Con eso sería mas fácil supongo.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 07/09/2011, 09:54
 
Fecha de Ingreso: julio-2011
Mensajes: 22
Antigüedad: 12 años, 9 meses
Puntos: 2
Respuesta: Sistema de Quotes #Post

Si, lo había pensado, pero no estoy muy puesto en expr. regulares. Ten en cuenta que cada vez que encuentro un #numero, tengo que separar el número, y buscar el mensaje en la db. Algo no muy complicado, ya lo tengo hecho, pero el problema es que es eso, necesito hacerlo en un bucle para todos los casos.

Intentaré buscar algo por ahí, que me devuelva todas las almoadillas en un array, y de ahí tiraré de for's.
  #4 (permalink)  
Antiguo 07/09/2011, 10:19
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Sistema de Quotes #Post

Con preg_match() puedes conseguirlo, lee lo siguiente:
http://www.forosdelweb.com/f18/aport...s-pcre-646110/
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 07/09/2011, 10:38
 
Fecha de Ingreso: julio-2011
Mensajes: 22
Antigüedad: 12 años, 9 meses
Puntos: 2
Respuesta: Sistema de Quotes #Post

Por ahora he conseguido separar todos los #numero, de esta forma:

Código:
$array3 = explode(" ", $string);

foreach($array3 as $bucle) {
	$bucle2 = explode("#", $bucle);
	foreach($bucle2 as $bucle3) {
		if (is_numeric($bucle3)) {
			$bucle4[] .= $bucle3;
		}
	}
}

foreach($bucle4 as $bucle5) {
	# Buscamos el post del quote
	ConexionDB();
	# Get Relacionadas
	$query = mysql_query('SELECT mensaje FROM noticias_comentarios WHERE idn = "'.$idn.'" AND idp = "'.$bucle5.'"');
	$check = mysql_num_rows($query);
	if($check == 0) {
		$cadena = '<a class="tooltip" href="#'.$bucle5.'" ref="El mensaje #'.$bucle5.' no existe"><strong>#'.$bucle5.'</strong></a>';
	}else{
		$fetch = mysql_fetch_array($query);
		$cadena = '<a class="tooltip" href="#'.$bucle5.'" ref="'.$fetch['mensaje'].'"><strong>#'.$bucle5.'</strong></a>';
	}
	# Volvemos a buscar el #
	$find = array('#'.$bucle5);
	$replace = array($cadena);
	$string = str_replace($find, $replace, $string);
}
Pero a la hora de hacer str_replace, si hay 2 y 25, el 25 no me lo cambia, solo el 25.
  #6 (permalink)  
Antiguo 07/09/2011, 10:45
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Sistema de Quotes #Post

Por eso es que te recomiendo usar expresiones regulares, de verdad.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 07/09/2011, 10:51
 
Fecha de Ingreso: julio-2011
Mensajes: 22
Antigüedad: 12 años, 9 meses
Puntos: 2
Respuesta: Sistema de Quotes #Post

Es que no se usarlas, he visto tu aporte pero aún así no se como hacerlo, por que no me acepta las #.
  #8 (permalink)  
Antiguo 07/09/2011, 11:05
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Sistema de Quotes #Post

Mira, te enseño cual sería la expresión pero tu haces el resto, ¿vale?
Código PHP:
$regexp '/#(\d+)\b/'
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 07/09/2011, 11:07
 
Fecha de Ingreso: julio-2011
Mensajes: 22
Antigüedad: 12 años, 9 meses
Puntos: 2
Respuesta: Sistema de Quotes #Post

Pero es que el número también lo tengo, tengo todo en un array, por ej:

Array
(
[0] => #2
[1] => #24
[2] => #22
[3] => #5
)

Pero en el caso de 24 o 22 solo me sustituye el #2

Además, estoy haciéndolo exactamente como http://es2.php.net/manual/en/function.preg-replace.php el Ejemplo 2, y no funciona.

Edit: Tengo que buscar la forma de reordenar el array de mayor a menor, para que no me siga pasando esto... a ver si consigo hacerlo.

Última edición por Tunnecino; 07/09/2011 a las 11:19
  #10 (permalink)  
Antiguo 07/09/2011, 11: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: Sistema de Quotes #Post

Te muestro un ejemplo:
Código PHP:
$texto 'Foo #1
#2
Bar #23
Candy #22'
;

$texto preg_replace_callback('/#(\d+)\b/', function($match)
{
  return 
algo_que_hacer_con($match[1]); // el número
},$texto); 
PDTA: funciona con PHP 5.3+
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #11 (permalink)  
Antiguo 07/09/2011, 11:38
 
Fecha de Ingreso: julio-2011
Mensajes: 22
Antigüedad: 12 años, 9 meses
Puntos: 2
Respuesta: Sistema de Quotes #Post

No entiendo lo que has hecho.
  #12 (permalink)  
Antiguo 07/09/2011, 11:45
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Sistema de Quotes #Post

Es sencillo, primero que nada explicamos la expresión: /#(\d)\b/

- el carácter "#" seguido de un numero, y finalmente un "limite" (espacio, fin de linea, etc.)

Entonces usamos la función preg_replace_callback() para reemplazar dichos caracteres con el resultado de una función (o callback):

- la función lo que hace es extraer de $match[1] (donde 1 es el primer valor capturado entre paréntesis.

Así pues, dicho callback devuelve el resultado de la función algo_que_hacer_con() pasándole el número capturado:

- dicha función es la que utilizas actualmente, la que recibe el número y devuelve "algo".

Lo que sucede finalmente es una serie de reemplazos a partir de la expresión dada.

Se que no es sencillo, pero leyendo y practicando seguro lo pillas.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #13 (permalink)  
Antiguo 07/09/2011, 11:48
 
Fecha de Ingreso: julio-2011
Mensajes: 22
Antigüedad: 12 años, 9 meses
Puntos: 2
Respuesta: Sistema de Quotes #Post

Es que a mi tu código me tira a error:

Parse error: syntax error, unexpected T_FUNCTION in test.php on line 9
  #14 (permalink)  
Antiguo 07/09/2011, 11:53
 
Fecha de Ingreso: julio-2011
Mensajes: 22
Antigüedad: 12 años, 9 meses
Puntos: 2
Respuesta: Sistema de Quotes #Post

Es que entiendo mejor mi código que no sirve para nada, que el que me has puesto : /

No te ofendas, pero prefiero seguir comiendome el coco a ver como puedo hacerlo mediante fors y foreachs que meterme con expresiones regulares que no funcionan la mitad de las veces.
  #15 (permalink)  
Antiguo 07/09/2011, 11:54
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Sistema de Quotes #Post

Cita:
Iniciado por Tunnecino Ver Mensaje
Es que a mi tu código me tira a error:

Parse error: syntax error, unexpected T_FUNCTION in test.php on line 9
Que conste que lo advertí...
Cita:
Iniciado por pateketrueke Ver Mensaje
[...] PDTA: funciona con PHP 5.3+
Bueno, el código para que funcione en versiones menores sería así:
Código PHP:
$texto 'Foo #1
#2
Bar #23
Candy #22'
;

$texto preg_replace_callback('/#(\d+)\b/''mi_callback',$texto);

function 
mi_callback($match)
{
  return 
algo_que_hacer_con($match[1]); // el número

Cita:
Iniciado por Tunnecino Ver Mensaje
[...] meterme con expresiones regulares que no funcionan la mitad de las veces.
Pensar así es un error, en tu caso especifico lo ideal son las expresiones regulares, te lo aseguro.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #16 (permalink)  
Antiguo 07/09/2011, 12:00
 
Fecha de Ingreso: julio-2011
Mensajes: 22
Antigüedad: 12 años, 9 meses
Puntos: 2
Respuesta: Sistema de Quotes #Post

Hmmm... reconozco que he sido un poco pesimista por que no entendía lo que estabas haciendo. En principio me funciona a medias, pero como puedo enviar una segunda variable a la función mi_callback?

Me explico:

Código:
$string = "Tenéis razon #2 y #24 es cierto! Sobre todo lo que dice #22 Aunque #5 también tiene razón";

$idn = 4; 

$string = preg_replace_callback('/#(\d+)\b/', 'mi_callback', $string);

function mi_callback($match, $idn){
	# Buscamos el post del quote
	ConexionDB();
	# Get Relacionadas
	$query = mysql_query('SELECT mensaje FROM noticias_comentarios WHERE idn = "'.$idn.'" AND idp = "'.$match[1].'"');
	$check = mysql_num_rows($query);
	if($check == 0) {
		return '<a class="tooltip" href="#'.$match[1].'" ref="El mensaje #'.$match[1].' no existe"><strong>#'.$match[1].'</strong></a>';
	}else{
		$fetch = mysql_fetch_array($query);
		return '<a class="tooltip" href="#'.$match[1].'" ref="'.$fetch['mensaje'].'"><strong>#'.$match[1].'</strong></a>';
	}
}

echo $string;
Funciona perfecto, es decir, me hace enlaces a todos los #post, pero claro, al no poder envíar $idn a la función, no consigo lo que realmente quiero.

Gracias por echar media tarde aquí ayudándome, de todas formas.

Última edición por Tunnecino; 07/09/2011 a las 12:02 Razón: Explicación
  #17 (permalink)  
Antiguo 07/09/2011, 12:03
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Sistema de Quotes #Post

Ahí es donde necesitas leer el manual, la función callback siempre recibirá un solo parámetro, el cual contiene un array con las capturas realizadas en la expresión.

Así que, o capturas algo mas para pasarlo (que no creo necesario), o dentro de mi_callback() pasas el argumento adicional a la función que empleas para devolver algo.

Código PHP:
function mi_callback($match)
{
  
$idn 99;

  return 
mi_otra_funcion($match[1], $idn);

__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #18 (permalink)  
Antiguo 07/09/2011, 12:07
 
Fecha de Ingreso: julio-2011
Mensajes: 22
Antigüedad: 12 años, 9 meses
Puntos: 2
Respuesta: Sistema de Quotes #Post

Ahora lo que me haría falta es saber como meter funciones dentro de funciones, no se si eso es posible o no.
  #19 (permalink)  
Antiguo 07/09/2011, 12:10
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Sistema de Quotes #Post

¿Meter funciones dentro de funciones?

No necesitas hacer eso, se trata de "llamar funciones en cualquier parte del código" y ahí no hay limites, pues las funciones son globales y puedes usarlas donde se te ocurra.

Entiende que no es lo mismo "usarlas" que "definirlas".

No te confundas, el manejo de funciones es básico en cualquier lenguaje de programación, no entiendo donde estaría tu complicación.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #20 (permalink)  
Antiguo 07/09/2011, 12:13
 
Fecha de Ingreso: julio-2011
Mensajes: 22
Antigüedad: 12 años, 9 meses
Puntos: 2
Respuesta: Sistema de Quotes #Post

Es que tengo que anidar funciones o si no, ya me dirás tu como envío la id de la noticia por cada post.

Edit:

Al final, algo así termina de funcionarme :D

Código:
function BBCodeExpand($string, $idn) {
	GLOBAL $idn;
	function mi_callback($match){
		return ProcessQuote($match[1], $GLOBALS['idn']); // el número
	}	
	function ProcessQuote($match, $idn){
		# Buscamos el post del quote
		ConexionDB();
		# Get Relacionadas
		$query = mysql_query('SELECT mensaje FROM noticias_comentarios WHERE idn = "'.$idn.'" AND idp = "'.$match.'"');
		$check = mysql_num_rows($query);
		if($check == 0) {
			return '<a class="tooltip" href="#'.$match.'" ref="El mensaje #'.$match.' no existe"><strong>#'.$match.'</strong></a>';
		}else{
			$fetch = mysql_fetch_array($query);
			return '<a class="tooltip" href="#'.$match.'" ref="'.$fetch['mensaje'].'"><strong>#'.$match.'</strong></a>';
		} 
	}	
	$string = preg_replace_callback('/#(\d+)\b/', 'mi_callback', $string);
	return $string;	
}

echo BBCodeExpand($string, $idn);
Gracias por todo! :D
  #21 (permalink)  
Antiguo 07/09/2011, 12:24
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Sistema de Quotes #Post

Anidar funciones dentro de funciones, que aunque posible, no es correcto.

Para dicho caso conviene mejor usar objetos.
Código PHP:
class BBCodeExpand {
    private 
$idn;
        private 
$string;

        public function 
__construct($string$idn)
       {
            
$this->idn $idn;
            
$this->string $string;

        
$this->string preg_replace_callback('/#(\d+)\b/', array($this'mi_callback'), $this->string);    
       }
        public function 
salida()
        {
             return 
$this->string;
        }
    public function 
mi_callback($match){
        return 
$this->ProcessQuote($match[1], $this->idn); // el número
    
}    
    public function 
ProcessQuote($match$idn){
        
# Buscamos el post del quote
        
ConexionDB();
        
# Get Relacionadas
        
$query mysql_query('SELECT mensaje FROM noticias_comentarios WHERE idn = "'.$idn.'" AND idp = "'.$match.'"');
        
$check mysql_num_rows($query);
        if(
$check == 0) {
            return 
'<a class="tooltip" href="#'.$match.'" ref="El mensaje #'.$match.' no existe"><strong>#'.$match.'</strong></a>';
        }else{
            
$fetch mysql_fetch_array($query);
            return 
'<a class="tooltip" href="#'.$match.'" ref="'.$fetch['mensaje'].'"><strong>#'.$match.'</strong></a>';
        } 
    }    
}

$obj = new BBCodeExpand($string$idn);
echo 
$obj->salida(); 
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #22 (permalink)  
Antiguo 07/09/2011, 12:28
 
Fecha de Ingreso: julio-2011
Mensajes: 22
Antigüedad: 12 años, 9 meses
Puntos: 2
Respuesta: Sistema de Quotes #Post

Genial!

Muchas gracias. La verdad es que se me había ocurrido hacer una clase pero no sabía muy bien como hacerla.

Gracias, ahora puedo basarme en esa clase para cuando me hagan falta.

Etiquetas: post, quotes, sistema
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 14:22.