Question

Je me pose la question suivante: quel est le moyen le plus efficace d'analyser quelque chose comme:

{{HEADER}}

Hello my name is {{NAME}}

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

    {{#PERSONS}}

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

    {{/PERSONS}}

{{/CONTENT}}

{{FOOTER}}

Bien entendu, il s’agit en fin de compte d’une sorte de système de gabarit. Mon plan est donc de créer une table de hachage pour "jeter le regard". le modèle, comme quelque chose comme ça

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

Notez que les "sections" (les balises commençant par #) peuvent être répétées plus d’une fois, et je pense que c’est ce qui me fait trébucher ...

De plus, toute section peut contenir un nombre illimité d’autres sections, ainsi que des balises régulières ...

Alors… comment vous y êtes vous pris?

Était-ce utile?

La solution

La sortie attendue est-elle quelque chose comme:

Ceci est un en-tête

Bonjour, je m'appelle David

This is the content ...

My name is Heino.

My name is Sebastian.

Ceci est le pied de page

Comment gérez-vous la relation entre les tableaux imbriqués dans la carte de hachage et les sections répétables dans le modèle? Quel est le comportement réel du modèle supposé être? Si un tableau est fourni pour un élément sans section, que fera-t-il? Si un élément de section se voit attribuer une seule valeur, sera-t-il traité de la même manière qu'un tableau avec un seul élément (je suppose que oui)?

Quoi qu'il en soit, en ce qui concerne l'analyseur pour le modèle (peu importe ce que vous allez faire avec le mappage des données) ... Ce que je ferais, c'est créer une classe pour chaque type de jeton, y compris une générique pour non -token contenu. Celles-ci hériteraient d'une classe de base de jeton commune avec des méthodes d'analyse, de rendu et de mappage pouvant être remplacées.

Tracez votre diagramme d'états et déterminez quels sont vos points d'entrée et de sortie pour chaque état, puis encodez-le dans la structure d'appels entre les jetons. En fin de compte, vous souhaitez générer une collection énumérable de jetons qui décrit votre modèle.

Une fois que vous avez cela dans une forme abstraite, vous pouvez parcourir la collection en appelant Map sur les jetons pour attribuer les données de la table de hachage aux jetons, puis appeler Render pour rendre le modèle dans sa forme finale.

L’espoir que cela aide.

Autres conseils

Le moyen le plus efficace consiste à compiler le modèle en code php. Et incluez la version compilée.

Le moteur de modèles Smarty fait quelque chose de similaire. Vous pouvez également consulter la source smarty et vérifier comment ils analysent les balises.

Vous feriez mieux d'utiliser quelque chose avec un analyseur existant, tel que XML ou JSON, de sorte que vous n'ayez pas à écrire votre propre analyseur et que d'autres puissent facilement écrire des documents pour votre analyseur sans avoir besoin d'outils spécialisés. Cependant, si vous voulez écrire votre propre analyseur, vous voudrez probablement vous pencher sur l’utilisation de Lex et Yacc .

J'utiliserais un analyseur tiers car j'aime travailler plus intelligemment et non plus durement, mais si vous le faites en tant qu'exercice ou si vous voulez vraiment créer votre propre moteur de template (en PHP, je suppose en raison de la balise ), Je commencerais par examiner les modèles de conception, le modèle de conception composite , plus précisément.

Le modèle composite est très utilisé dans le framework Java pour des tâches comme celle-ci, y compris l'analyse XML.

Je voudrais utiliser quelque chose comme ceci dans un fichier séparé .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 ?>

Et incluez simplement le fichier ci-dessus dans celui dans lequel les variables référencées sont renseignées.

Croyez-le ou non, PHP fournit déjà toutes les fonctionnalités que les systèmes de templates prétendent implémenter. Il n'est pas nécessaire d'ajouter une autre couche d'abstraction (et de complexité) en plus de PHP.

J'utilise le DOM de PHP . Mon langage de modèle est simplement HTML avec les attributs ID et class. Toutefois, si vous souhaitez respecter votre plan, j’utiliserais preg_replace_callback un modèle qui correspond à votre syntaxe. une fonction de rappel qui trouve le remplacement approprié dans votre hachage, en s’appelant récursivement sur des éléments de conteneur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top