Pregunta

Me pregunto: ¿Cuál es la forma más efectiva de analizar algo como:

{{HEADER}}

Hello my name is {{NAME}}

{{#CONTENT}}
    This is the content ...

    {{#PERSONS}}

        <p>My name is {{NAME}}.</p>

    {{/PERSONS}}

{{/CONTENT}}

{{FOOTER}}

Por supuesto, esto pretende ser un sistema de plantillas al final, por lo que mi plan es crear un mapa de hash para " colocar sobre " La plantilla, como algo como esto

$hash = array(
    'HEADER' => 'This is a header',
    'NAME' => 'David',
    'CONTENT' => array('PERSONS' => array(array('NAME' => 'Heino'), array('NAME' => 'Sebastian')),
    'FOOTER' => 'This is the footer'
    );

Vale la pena notar que las " secciones " (las etiquetas que comienzan con #), se pueden repetir más de una vez, y creo que esto es lo que me sorprende ...

Además, cualquier sección puede contener cualquier cantidad de otras secciones y etiquetas regulares ...

Entonces ... ¿cómo lo hiciste?

¿Fue útil?

Solución

Es el resultado esperado de esto algo así como:

Este es un encabezado

Hola, mi nombre es David

This is the content ...

My name is Heino.

My name is Sebastian.

Este es el pie de página


¿Cómo está administrando la relación de las matrices anidadas en el mapa hash a las secciones repetibles en la plantilla? ¿Cuál es el comportamiento real de la plantilla que se supone que es? Si se proporciona una matriz para un elemento que no es de sección, ¿qué hará? Si a un elemento de sección se le proporciona un solo valor, ¿se tratará de la misma forma que una matriz con un solo elemento (supongo que sí)?

De todos modos, con respecto al analizador de la plantilla (independientemente de lo que termine haciendo con la asignación de datos) ... Lo que haría sería crear una clase para cada tipo de token, incluida una genérica para no Contenido de token. Estos se heredarían de una clase base de token común con métodos anulables de Parse, Render y Map.

Grafique su diagrama de estado y descubra cuáles son sus puntos de entrada y salida para cada estado, luego codifíquelo en la estructura de llamadas entre los tokens. Al final, desea generar una colección enumerable de tokens que describa su plantilla.

Una vez que tenga eso en forma abstracta, puede iterar sobre la colección llamando a los tokens para asignar los datos del hashmap a los tokens, y luego llamar a Render para renderizar la plantilla en su forma final.

Espero que ayude.

Otros consejos

La forma más eficiente es compilar la plantilla en código php. Y solo incluye la versión compilada.

El Smarty Template Engine hace algo similar. También puede consultar la fuente de smarty y ver cómo analizan las etiquetas.

Usted apostaría mejor si usa algo con un analizador existente como XML o JSON para no tener que escribir su propio analizador, y para que otros puedan escribir fácilmente documentos para su analizador sin necesidad de herramientas especializadas. Sin embargo, si desea escribir su propio analizador, probablemente desee utilizar Lex y Yacc .

Iría con un analizador de terceros porque me gusta trabajar de forma más inteligente y no más difícil, pero si lo hace como un ejercicio o si realmente desea crear su propio motor de plantillas (en PHP supongo que debido a la etiqueta ), Empezaría con la revisión de patrones de diseño, el patrón de diseño compuesto específicamente.

El patrón compuesto se usa mucho en el marco de Java para cosas como esta, incluido el análisis XML.

Yo usaría algo como esto dentro de un archivo separado .php:

<?php echo $HEADER ?>

Hello my name is <?php echo $NAME?>

<div id="CONTENT">
    This is the content ...

    <?php foreach ($PERSONS as $PERSON) : ?>

        <p>My name is <?php echo $PERSON['NAME']?>.</p>

    <?php endforeach ?>

</div>

<?php echo $FOOTER ?>

E incluya el archivo anterior en el que se rellenan las variables a las que se hace referencia.

Lo creas o no, PHP ya proporciona todas las características que los sistemas de plantillas que afirman implementar. No es necesario agregar otra capa de abstracción (y complejidad) sobre PHP.

Utilizo DOM de PHP para esto. Mi lenguaje de plantilla es simplemente HTML con ID y atributos de clase. Sin embargo, si desea seguir con su plan, usaría preg_replace_callback con un patrón que coincida con su sintaxis y una función de devolución de llamada que encuentra el reemplazo adecuado en su hash, llamándose a sí misma de forma recursiva en los elementos de contenedor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top