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
![Pensando](http://static.forosdelweb.com/fdwtheme/images/smilies/scratchchin.gif)
saludos
| |||
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:
Ahora bien, respecto a la anotación que haces al final:<?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; ?> Cita: 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 ]).pero sólo en la parte del 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. |