Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Creando etiquetas dentro de un string

Estas en el tema de Creando etiquetas dentro de un string en el foro de PHP en Foros del Web. Hola a tod@s, os comento el problema con el que me he encontrado. He creado un sistema de envío de noticias, en el que un ...
  #1 (permalink)  
Antiguo 21/11/2014, 16:27
 
Fecha de Ingreso: abril-2006
Mensajes: 105
Antigüedad: 18 años
Puntos: 11
Pregunta Creando etiquetas dentro de un string

Hola a tod@s, os comento el problema con el que me he encontrado.

He creado un sistema de envío de noticias, en el que un administrador (que no tiene ningún tipo de conocimiento de html) redacte el contenido.

Ese contenido en portada se resume, cortando el string en el espacio anterior una vez haya alcanzado el número máximo de caracteres, hasta ahí todo correcto.

El problema, es que quiero que cuando se redacte un mensaje, se pueda introducir una etiqueta creada por mi, la cual pueda ser identificada con un explode o similar, y se extraiga el contenido.

De forma que se puedan introducir muchas etiquetas como esa, y las sustituya por código html cada vez que la función encuentre una.

He probado a hacer lo siguiente:

Código PHP:

// Con esta función trato de sacar el contenido entre las etiquetas que le especificaré
// cuando llame a la función
function sacarcontenidoyetiquetas($cad,$uno,$dos){
  
$sip strstr($cad,$uno);
  
$a = array($uno,$dos);
  
$b = array("","");
  
$salida preg_replace($a,$b,$sip);
  return 
$salida;
}

// Con ésto, hago algo parecido, pero solo extraigo lo que contienen esas etiquetas

function sacarcontenido($TheStr$sLeft$sRight){
        
$pleft strpos($TheStr$sLeft0);
        if (
$pleft !== false){
                
$pright strpos($TheStr$sRight$pleft strlen($sLeft));
                If (
$pright !== false) {
                        return (
substr($TheStr$pleft strlen($sLeft), ($pright - ($pleft strlen($sLeft)))));
                }
        }
        return 
'';
}

// Dentro de cada etiqueta, habrá 4 argumentos, y en función de éstos, se generará
// el código html de la imagen con la siguiente función

function colocarimagen($id,$dimensiones,$alineado,$ampliacion){

    global 
$conexion;
    
$resultado mysqli_query($conexion"select * from imagenes where id=$id") or die(mysqli_error());
    
$contenido mysqli_fetch_array($resultado);
    
$urlimagen $contenido['url'];

    if(
$alineado == "centro") { 
        
$estilo "display:block; margin:auto;";

    } elseif(
$alineado == "derecha") {
        
$estilo "float:right;";
    } else {
        
$estilo "float:left;";
    }

    if (
$dimensiones == "reducido") {
        
$ruta "./imagenes/mini/mini-";
    } else {
        
$ruta "./imagenes/";
    }

    if(
$ampliacion == "ampliar"){
        
$resultado "<a href='./imagenes/$urlimagen' rel='lightbox'><img class='imagenes' style='$estilo' src='$ruta$urlimagen'></a>";
    } else {
        
$resultado "<img class='imagenes' style='$estilo' src='$ruta$urlimagen'>";
    }

    return 
$resultado;
    
}
// Esta variable contiene el texto donde tengo que buscar coincidencias con 
// las etiquetas, que llamaré [imagen] y [finimagen]
$textoreducido  "Textofaouboabgoagagfaga [imagen]65,reducido,centro,ampliar[finimagen]agfa,
fagwag agawgawgagwaga[imagen]35,reducido,derecha,ampliar[finimagen]"
;


// Llamo a la función sacarcontenido() y le indico las etiquetas a tomar referencia
    
$datosimagen=sacarcontenido($textoreducido,"[imagen]","[finimagen]");

// Lo mismo que antes, pero indico el código que reemplazaré más adelante con 
// la función sacarcontenidoyetiquetas()
    
$textoareemplazar sacarcontenidoyetiquetas($textoreducido,"[imagen]","[finimagen]");

// Creo un array con los 4 argumentos separados por , gracias a un explode
    
$datosimagenseparados explode(","$datosimagen);
    
$id $datosimagenseparados[0];
    
$dimensiones $datosimagenseparados[1];
    
$alineado $datosimagenseparados[2];
    
$ampliacion $datosimagenseparados[3];

// Genero el código html pasándole los argumentos a la función colocarimagen()
    
$imagenresultado colocarimagen($id,$dimensiones,$alineado,$ampliacion);

// uso str_replace para sustituir la etiqueta escrita, por el html generado y lo 
// almaceno en la variable $resumen
    
$resumen str_replace($textoareemplazar$imagenresultado$textoreducido); 
Lo que si consigo, es extraer correctamente los argumentos que necesito para generar el código html de la imagen, pero a la hora de sustituir las etiquetas por dicho código, no funciona, no me da errores, pero solo aparece el resumen de la primera noticia y el contenido de la variable resumen, pero sin sustituir correctamente las etiquetas...

He intentado explicar el código lo mejor que he podido por si alguien me puede echar un cable, que no le lleve mucho tiempo hacerse una idea de lo que trato de hacer.

Un saludo y muchas gracias
  #2 (permalink)  
Antiguo 21/11/2014, 17:37
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Creando etiquetas dentro de un string

Me parece que estás haciendo mucho para algo más simple, con una expresión regular y preg_replace_callback() debería ser suficiente:

Código PHP:
Ver original
  1. function procesar_tags($matches) {
  2.   list(, $tagName, $tagValue) = $matches;
  3.  
  4.   return "<!-- aquí podría procesar: $tagName($tagValue) -->";
  5. }
  6.  
  7. $regex = '/\[(\w+)\]([^[\]]+?)\[\/\\1\]/s';
  8.  
  9. $entrada = '[foo]a,b,c[/foo] y [x]yz[/x]';
  10. $salida = preg_replace_callback($regex, 'procesar_tags', $entrada);
  11.  
  12. echo $salida;

¿Se entiende la idea?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 21/11/2014, 18:43
 
Fecha de Ingreso: abril-2006
Mensajes: 105
Antigüedad: 18 años
Puntos: 11
Respuesta: Creando etiquetas dentro de un string

Dios, no me digas que era algo tan simple... al parecer me puse a trabajar en algo que ya estaba inventado :P, voy a implementarlo y vuelvo con los resultados de como me fue, muchas gracias pateletrueke ;).

Hay una cosa que no entiendo, ¿Qué momento se convierte $matches en un array? ¿Al usar callback, la función devuelve por defecto un array de los elementos encontrados?

Voy a investigarlo un poco y volveré con los resultados.

Última edición por Malekith; 21/11/2014 a las 19:16 Razón: Nuevas preguntas
  #4 (permalink)  
Antiguo 21/11/2014, 21:00
 
Fecha de Ingreso: abril-2006
Mensajes: 105
Antigüedad: 18 años
Puntos: 11
Respuesta: Creando etiquetas dentro de un string

Solucionado chicos!! voy a poner el código por si le viene bien a alguien, y por si veis que le falta algún fleco o algo que podría mejorar.

Código PHP:
$regex '/\[(\w+)\]([^[\]]+?)\[\/\\1\]/s';
function 
procesar_tags($matches) {
  list(, 
$tagName$tagValue) = $matches;

    if(
$tagName == "imagen"){
        
$argumentos explode(","$tagValue);
        
$id $argumentos[0];
        
$dimensiones $argumentos[1];
        
$alineado $argumentos[2];
        
$ampliacion $argumentos[3];

            global 
$conexion;
            
$resultado mysqli_query($conexion"select * from imagenes where id=$id") or die(mysqli_error());
            
$contenido mysqli_fetch_array($resultado);
            
$urlimagen $contenido['url'];
            
$coincidencias=mysqli_num_rows($resultado);

            if(
$coincidencias!=0){
                if(
$alineado == "centro") { 
                
$estilo "display:block; margin:auto;";
                } elseif(
$alineado == "derecha") {
                    
$estilo "float:right;";
                } else {
                    
$estilo "float:left;";
                }
                if (
$dimensiones == "reducido") {
                    
$ruta "./imagenes/mini/mini-";
                } else {
                    
$ruta "./imagenes/";
                }
                if(
$ampliacion == "ampliar"){
                    
$resultado "<a href='./imagenes/$urlimagen' rel='lightbox'><img class='imagenes' style='$estilo' src='$ruta$urlimagen'></a>";
                } else {
                    
$resultado "<img class='imagenes' style='$estilo' src='$ruta$urlimagen'>";
                }

                
$salida=$resultado;

            } else { 
$salida="La imagen especificada no se existe, por favor, corrige el error"; }

    } else {
        
$salida "<strong>Comando desconocido</strong>";
    }

  return 
$salida;
}

$entrada '[imagen]80,reducido,centro,aumentar[/imagen] texto seguido de otro comando, pero esta vez dira que es desconocido
porque de momento la funcion procesar_tags() solo admite imagenes [x]tag que va a dar error[/x]'
;

$salida preg_replace_callback($regex'procesar_tags'$entrada);
echo 
$salida
He hecho todo el proceso en la misma función, lo que me ahorra muchas líneas de código, muchísimas gracias pateketrueke.

Con ésto, al comprimir tanto el código, cuando corto el texto, corto prácticamente lo que realmente es texto, y toda la etiqueta de las imágenes no ocupa lugar, luego desde php leo el contenido del texto recortado y lo adapto al html.

De momento solo he hecho que funcione con imagenes, pero más adelante pondré etiquetas de enlaces y demás. ¿Habrá algún problema si una etiqueta contiene a otra? bueno, ya veré ésto más adelante.

Un saludo y muchas gracias ;)

Última edición por Malekith; 25/11/2014 a las 16:35

Etiquetas: creando, etiquetas, html, mysql, select, sql, string, variable
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 18:25.