Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] PHP OO Etiqueta dentro de otra en un string, usando expresión regular

Estas en el tema de Etiqueta dentro de otra en un string, usando expresión regular en el foro de PHP en Foros del Web. Hola chicos, hace unos días vine con una duda sobre como podía extraer etiquetas de un string, y gracias a pateketrueke pude resolverlo . Ahora ...
  #1 (permalink)  
Antiguo 25/11/2014, 16:58
 
Fecha de Ingreso: abril-2006
Mensajes: 105
Antigüedad: 18 años
Puntos: 11
Etiqueta dentro de otra en un string, usando expresión regular

Hola chicos, hace unos días vine con una duda sobre como podía extraer etiquetas de un string, y gracias a pateketrueke pude resolverlo .

Ahora me encuentro con un problema derivado del primero, y es como extraer los valores de una etiqueta que contiene a otra usando el mismo método.

El código que empleo es el siguiente:

Código PHP:
function procesar_tags($matches) {

// identifico las etiquetas y sus respectivos valores
  
list(, $tagName$tagValue) = $matches;

// dependiendo de la etiqueta que encuentre, hago una cosa u otra
    
if($tagName == "imagen"){
        
$argumentos explode(","$tagValue);
        
$id $argumentos[0];
        
$dimensiones $argumentos[1];
        
$alineado $argumentos[2];
        
$ampliacion $argumentos[3];
        if(empty(
$id)) {$id 0;}
            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 == "ampliable"){
                    
$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="<span class='textoerror'>La imagen especificada no se existe, por favor, corrige el error</span>"; }

    } elseif (
$tagName == "enlace") {

        
$argumentos explode(","$tagValue);

        
$url $argumentos[0];
        if(
strpos($url"http://") !== false || strpos($url"https://") !== false){ }
        else { 
$url "http://".$url; }

        
$nombre $argumentos[1];
        if (empty(
$url)){
            
$salida "<strong>Falta la dirección del enlace</strong>";
        } elseif(empty(
$nombre) && !empty($url)){
            
$salida "<a href='$url' target='_blank'>$url</a>";
        } else {
        
$salida "<a href='$url' target='_blank'>$nombre</a>";
        }

    } else {

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

  return 
$salida;
}
// Patrón de la expresión regular
$regex '/\[(\w+)\]([^[\]]+?)\[\/\\1\]/s';
// Texto donde buscar las etiquetas
$entrada 'El enlace es la siguiente imagen: [enlace]www.google.es,[imagen]80,reducido,centro,aumentar[/imagen][/enlace]';

$salida preg_replace_callback($regex'procesar_tags'$entrada);
echo 
$salida
El problema seguramente esté en el patrón que utilizo (que es el mismo que me dijo pateketrueke) en el problema anterior, pero no sé como modificarlo correctamente para que una etiqueta ignore otras etiquetas que estén dentro como en el caso que expongo más arriba.

Lo que consigo con este código, es que se muestre la imagen, pero en vez de convertirse en un enlace, las etiquetas de [enlace] se muestran tal como están escribas (las etiquetas [enlace][/enlace] funcionan correctamente si no se incluye una etiqueta dentro).

Este problema lo podría solucionar fácilmente si introduzco una palabra clave en el último parámetro de la etiqueta [enlace] para que mostrara una imagen, pero estoy empeñado en conseguir que funcione de esta manera, sobre todo porque a la persona que lo va administrar le sería mucho más fácil hacerlo de esta manera.

Un saludo y muchas gracias
  #2 (permalink)  
Antiguo 25/11/2014, 17:04
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Etiqueta dentro de otra en un string, usando expresión regular

La idea sería procesar el contenido tantas veces como "capturas" puedas hacer:

Código PHP:
Ver original
  1. while (1) {
  2.   // copia temporal
  3.   $tmp = $text;
  4.  
  5.   // procesamos los tags
  6.   $text = process($text);
  7.  
  8.   // si la copia temporal ES IDÉNTICA entonces salimos
  9.   if ($tmp === $text) {
  10.     break;
  11.   }
  12. }

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

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 25/11/2014, 18:14
 
Fecha de Ingreso: abril-2006
Mensajes: 105
Antigüedad: 18 años
Puntos: 11
Respuesta: Etiqueta dentro de otra en un string, usando expresión regular

Hola pateketrueke, ¿Dónde quieres que te ponga un monumento?

No termino de comprender del todo lo que me estás explicando, sobre todo lo último, ¿Para qué hay que mirar si la copia temporal es idéntica? en teoría una vez se procese cualquier etiqueta, el texto dejará de ser igual al texto que había al principio, por lo que el break nunca se producirá y se convertirá en un bucle infinito.

Seguiré probando a ver si se me ilumina la bombilla.

Muchas gracias paketetrueke
Un saludo
  #4 (permalink)  
Antiguo 25/11/2014, 18:20
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Etiqueta dentro de otra en un string, usando expresión regular

El tema es que la expresión regular sólo analiza una etiqueta a la vez, en un primer procesamiento dejará intactas algunas etiquetas.

Esa es precisamente la técnica, por eso debes volver a procesar el contenido verificando que haya cambiado algo: si no hubo cambio alguno entonces ya no hay etiquetas.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 25/11/2014, 19:20
 
Fecha de Ingreso: abril-2006
Mensajes: 105
Antigüedad: 18 años
Puntos: 11
Respuesta: Etiqueta dentro de otra en un string, usando expresión regular

Ya lo entendí , lo que significa que temp en un principio tiene el valor del texto, y luego el valor de temp cambia por el del texto anterior con cada interacción. Luego comprobamos si el texto que contenía la variable temporal coincide con el nuevo generado, y si es así, rompemos el bucle.

Lo hice así:

Código PHP:
$regex '/\[(\w+)\]([^[\]]+?)\[\/\\1\]/s';
     
// Procesamos las etiquetas iniciando un bucle que solo termina cuando no quedan etiquetas por procesar
     
while(1){
         
$tmp $resumen;
        
// procesamos los tags
        
$resumen preg_replace_callback($regex'procesar_tags'$tmp);
        if(
$tmp === $resumen){ 
            break; 
        }
    } 
Muchas gracias pateketrueke, de verdad , lo que me había confundido era que pusistes process($text);, cuando lo que necesitábamos procesar era process($tmp); , supongo que un descuido, y me tuvo un rato en jake

Un saludo

Etiquetas: etiqueta, mysql, regular, select, sql, string, usando
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 15:10.