Ver Mensaje Individual
  #1 (permalink)  
Antiguo 25/11/2014, 16:58
Malekith
 
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