Foros del Web » Programando para Internet » PHP »

modificar texto entre "tags"

Estas en el tema de modificar texto entre "tags" en el foro de PHP en Foros del Web. hola, cómo puede hacerse que por ejemplo una cadena de texto que está entre los tags [ rojo] y [ /rojo] lo muestre de color ...
  #1 (permalink)  
Antiguo 12/08/2003, 12:21
Avatar de Sir Matrix  
Fecha de Ingreso: octubre-2000
Ubicación: Dentro de mi cabeza. ono?
Mensajes: 1.264
Antigüedad: 23 años, 5 meses
Puntos: 3
modificar texto entre "tags"

hola, cómo puede hacerse que por ejemplo una cadena de texto que está entre los tags [ rojo] y [ /rojo] lo muestre de color rojo ??

osea algo como lo que está en estos foros, que lo que va entre ciertos tags, lo formatea de alguna manera. pero sólo en la parte del php





saludos

Última edición por Sir Matrix; 12/08/2003 a las 12:24
  #2 (permalink)  
Antiguo 12/08/2003, 22:06
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 8 meses
Puntos: 1
Hola,

El enunciado con el que comienzas es muy claro, aunque tu frase final, "pero sólo en la parte del php", me intriga un poco. Así que en principio me limitaré a hablar sobre tu problema inicial.

La solución podría implementarse de varias formas, y una posibilidad es que escribas un analizador sintáctico particular, arbitrariamente sofisticado, que procese cadenas y haga el tipo de reemplazos que buscas, quizás ganando un poco de eficiencia en el camino, en la medida en que tus reglas iniciales te lo permitan.

El problema de escribir analizadores sintácticos (llamados también parsers por los conocedores), y en general crear herramientas que trabajen sobre un conjunto de reglas sintácticas dadas, es muy bonito y ha dado para una gran cantidad de literatura, que por supuesto encontrarás fascinante si te interesa el tema de escribir tus propios analizadores optimizables hacia cierto conjunto de condiciones.

En fin, me parece que el camino más común en este tipo de situaciones es hacer uso de expresiones regulares, que en PHP son soportadas de forma razonablemente eficaz. Asumo que deseas darle un formato HTML a tu salida, por lo que el ejemplo que te presento a continuación lo que hace es transformar etiquetas del tipo "[ rojo ] [ /rojo ]" a algo como '< font color="#ff0000" > < /font >'.

Código:
<?php

// Cadena de ejemplo

$fuente = <<<FIN_EJEMPLO
Esto es una prueba. Queremos que [rojo]estas palabras[/rojo] sean
marcadas como texto en color rojo. Quizás [rojo]estas también[/rojo].
FIN_EJEMPLO;


// Realizar un reemplazo simple

$salida = preg_replace ('/\\[\\s*rojo\\s*\\](.*?)\\[\\s*\\/rojo\\s*\\]/s',
                        '<font color="#ff0000">$1</font>', $fuente);


// Imprimir la salida

print <<<FIN_SALIDA
<h3>Cadena inicial</h3>
<p>$fuente</p>

<h3>Salida</h3>
<p>$salida</p>
FIN_SALIDA;

?>
Ahora bien, respecto a la anotación que haces al final:

Cita:
pero sólo en la parte del php
debo admitir que no entiendo muy bien lo que quieres decir. Asumiré entonces que quizás a lo que refieres es que en tu caso deseas hacer reemplazos de ciertas etiquetas (como [ rojo ]) sólo si están anidadas dentro de otras etiquetas particulares (como por ejemplo, [ php ]).

En tal caso, te ofrecería entonces este ejemplo, en donde los reemplazos de las etiquetas [ rojo ] se realizan únicamente si están circundadas por otra etiqueta: [ colores ].

La estrategia es simple: primero se ubican los trozos de cadena que coinciden con la etiqueta [ colores ], luego estos segmentos se usan para efectuar los reemplazos de [ rojo ], y finalmente, se reemplazan (mediante la función str_replace(), y no usando expresiones regulares) las coincidencias de [ colores ] en la cadena original con las cadenas modificadas.


Código:
<?php

// Cadena de ejemplo

$fuente = <<<FIN_EJEMPLO
Esto es una prueba. Queremos que [rojo]estas palabras[/rojo] NO sean
marcadas como texto en color rojo, ya que no están ubicadas dentro
de etiquetas [colores][/colores] externas.

<br /><br />

[colores]En cambio, [rojo]aquí[/rojo] sí deseamos que se realice un
reemplazo[/colores].
FIN_EJEMPLO;


// Primero, encontrar y separar los segmentos de la cadena fuente
// delimitados por [colores] y [/colores].

preg_match_all ('/\\[\\s*colores\\s*\\].*?\\[\\s*\\/colores\\s*\\]/s',
                $fuente, $coincidencias);


// Ahora, dentro de esos segmentos, realizar los reemplazos. Los
// segmentos ya modificados seran almacenados en $modificaciones

$num_coincidencias = count ($coincidencias[0]);
$modificaciones    = array ();

for ($i = 0; $i < $num_coincidencias; $i++)
    $modificaciones[] =
        preg_replace ('/\\[\\s*rojo\\s*\\](.*?)\\[\\s*\\/rojo\\s*\\]/',
                      '<font color="#ff0000">$1</font>',
                      $coincidencias[0][$i]);


// Finalmente, reemplazar en la cadena fuente los segmentos que
// coincidieron originalmente con [colores] y [/colores] con las
// cadenas modificadas.

for ($i = 0; $i < $num_coincidencias; $i++)
    $salida = str_replace ($coincidencias[0][$i], $modificaciones[$i],
                           $fuente);



// Imprimir la salida

print <<<FIN_SALIDA
<h3>Cadena inicial</h3>
<p>$fuente</p>

<h3>Salida</h3>
<p>$salida</p>
FIN_SALIDA;

?>

Los anteriores ejemplos hacen uso de las funciones relacionadas con expresiones regulares (compatibles con el estilo Perl) de PHP. Por esto, es recomendable que tu primer destino en caso de dudas sobre algo en particular de las expresiones regulares usadas, sea la sección pertinente del manual de PHP.

Un cordial saludo.
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

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 07:31.