Frage

Ich frage mich - Was ist der effektivste Weg, um etwas von Parsen wie:

{{HEADER}}

Hello my name is {{NAME}}

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

    {{#PERSONS}}

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

    {{/PERSONS}}

{{/CONTENT}}

{{FOOTER}}

Natürlich ist dies soll ein wenig von einem Template-System in dem Ende sein, so mein Plan einen hashmap zu erstellen, ist die Vorlage zu „lay over“, so etwas wie diese

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

Es ist bemerkenswert, dass die „Abschnitte“ (die Tags, die mit # beginnen), können mehr als einmal wiederholt werden, und ich denke, das ist es, was mir Reise bis ...

Auch kann jeder Abschnitt eine beliebige Anzahl von anderen Abschnitten und regelmäßige Tags ...

So .. Wie hast du es?

War es hilfreich?

Lösung

Ist der erwartete Ausgang dieses so etwas wie:

Dies ist ein Header

Hallo mein Name ist David

This is the content ...

My name is Heino.

My name is Sebastian.

Dies ist die Fußzeile


Wie verwalten Sie die Beziehung von verschachtelten Arrays in der Hash-Karte auf wiederholbare Abschnitte in der Vorlage? Was ist das tatsächliche Verhalten der Vorlage sein soll? Wenn ein Array für ein nicht-Profilelement vorgesehen ist, was wird es tun? Wenn ein Abschnitt Element einen einzelnen Wert zur Verfügung gestellt wird, wird es das gleiche wie ein Array mit nur einem einzigen Elemente (ich nehme so) behandelt werden?

Wie auch immer, in Bezug auf die Parser für die Vorlage (unabhängig davon, was Sie mit der Zuordnung von Daten am Ende tun) ... Was würde ich tun, ist eine Klasse erstellen, für jede Art von Token, einschließlich Standardversion für nicht -token Inhalt. Diese würden erben von einer gemeinsamen Token Basisklasse mit overridable Parse, Rendern und Map-Methoden.

Diagramm Ihr Zustandsdiagramm und herauszufinden, was Ihre Einstiegs- und Ausstiegspunkte für jeden Zustand, so dass kodieren in die Aufrufstruktur zwischen den Token. Am Ende wollen Sie eine zählbare Sammlung von Token erhalten, die die Vorlage beschreibt.

Sobald Sie, dass in einer abstrakten Form, können Sie über die Sammlung iteate Karte auf den Token ruft die Daten aus dem hashmap den Token zuweisen, und rufen Sie dann Render die Vorlage zu machen in seiner endgültigen Form ist.

Ich hoffe, das hilft.

Andere Tipps

Der effizienteste Weg, um zu Compile die Vorlage PHP-Code. Und nur ist die kompilierte Version.

Die Smarty Template Engine etwas Ähnliches tut. Sie können auch an der Smarty Quelle schauen und überprüfen, wie sie Tags analysieren.

mit so etwas mit einem vorhandenen Parser wie XML oder JSON

würden Sie wetten besser dran, so müssen Sie Ihren eigenen Parser nicht schreiben, und damit andere leicht Dokumente für Ihren Parser schreiben, ohne spezielle Werkzeuge zu benötigen. Allerdings, wenn Sie möchten, dass Ihre eigenen Parser schreiben, möchten Sie wahrscheinlich schauen mit Lex und Yacc .

ich mit einem Dritten Parser gehen würde, weil ich schlauer arbeiten und nicht härter, aber wenn Sie dies als eine Übung tun, oder Sie wollen wirklich Ihren eigenen Template-Engine (in PHP bauen Ich gehe davon aus, weil den Tages ), würde ich mit der Überprüfung Design Patterns, die Verbundentwurfsmuster beginnen speziell.

Das zusammengesetzte Muster viel in dem Java-Framework für Sachen wie diese, einschließlich XML-Analyse verwendet wird.

ich so etwas wie dies in einer .php separaten Datei verwenden würde:

<?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 ?>

Und sind nur die obige Datei in dem, in dem die referenzierten Variablen bestückt sind.

Ob Sie es glauben oder nicht, PHP bietet bereits alle Funktionen, die Systeme gibt Templating behaupten zu implementieren. Es gibt keine Notwendigkeit, eine andere Ebene der Abstraktion (und Komplexität) oben auf PHP hinzuzufügen.

Ich benutze PHP DOM für diese. Meine Template-Sprache ist einfach HTML mit ID und Klassenattribute. Wenn Sie mit Ihrem Plan festhalten wollen, obwohl, würde ich verwenden preg_replace_callback mit einem Muster, das die Syntax übereinstimmt und eine Callback-Funktion, die den entsprechenden Ersatz in Ihrem Hash findet, sich selbst rekursiv auf Containerelemente aufrufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top