#26
| ||||
| ||||
Zitat:
Zitat:
Man kann zwar mit regulären Ausdrücken auch rekursive Muster finden, allerdings ist das dann ein bisschen aufwändiger. |
#27
| |||
| |||
Ich hab ja schon unzählige TemplateEngines geschrieben. Einige davon auch mit Template-Scripting. Und ich muss ehrlich sagen, dass meine mir alles bieten was ich brauche, dabei aber (der Parser) nicht auf über 100 Zeilen kommt. @Reimer: Und da ist eine Funktion zum Formatieren eines Timestamps, bzw. auslesen der aktuellen Tageszeit mit drin. Cache usw. ebenfalls, If-Abfragen und der Aufruf von PHP-Funktionen (nebenher noch Variablen und das einbinden von Dateien). Also im Prinzip ne ganze Menge in ziehmlich wenig Zeilen. Aber für meinen Geschmack ist auch das schon wieder zuviel. Was Schleifen in Templates betrifft... generell nicht schlecht, aber ich mag allzu große Templates auch nicht. Ich bin momentan gezwungen mit Smarty zu arbeiten (als "Designer" - nicht als Programmierer) und ich finde es einfach schrecklich. Leider hat der Autor des Programmes vergessen, dass Smarty Kommentare anbietet, wodurch der Smarty-Code für mich wirklich schwerer durchzuarbeiten ist, als es der Code vom wBB jemals war (nimm's nicht persönlich, frederic). Zitat:
Die Templates werden in reines PHP/HTML umgewandelt. Mehr nicht. Zitat:
__________________ Patrick Gotthardt Patrick Gotthardt on Software |
#28
| ||||
| ||||
@exe: Sicher? Schließlich sind Regexp von Geburt aus greedy (gierig) wodurch beispielsweise folgendes passieren würde: Code: {if $var == "meineVar"} hier kommt irgendwas hin {/if} {if $name == "meinName"} hier auch {/if} Code: {if $var == "meineVar"} hier kommt irgendwas hin {/if} {if $name == "meinName"} hier auch {/if} Code: hier kommt irgendwas hin {/if} {if $name == "meinName"} hier auch Wenn er nicht greedy sein soll, müsste man als Modifier U hinzufügen. Und diese Rekursion kann man IMHO nicht nur durch einen Regexp lösen, wenn doch, hätte ich gerne ein Beispiel. Bis dann, codethief |
#29
| |||
| |||
Die RegExp sind ungreedy. .*? = .* (mit U) __________________ Patrick Gotthardt Patrick Gotthardt on Software |
#30
| ||||
| ||||
Achso? Wusste ich ja noch gar nicht... Danke, man lernt hier jeden Tag mehr. PS: Hab mal eine Frage - ich will bei der nächsten Version meiner Forensoftware Languagevars benutzen und will nun in jedem Template, bevor es benutzt wird, die $language-Variablen durch ihren Wert ersetzen, damit ich in selbigen auch Variablen benutzen kann: $temp = preg_replace("/\$language\[(.*)\]/eU", "\$language['\\1']", $temp); Aber das funktioniert jetzt irgendwie nicht mehr (früher hat's damit immer geklappt). [EDIT]: Irgendwie bin ich nicht richtig ausgeschlafen: das \ vor $language war falsch, entweder \\\ oder den String in 's fassen. Bis dann, codethief |
#31
| ||||
| ||||
Zitat:
Zitat:
Zitat:
Direkt benutzt habe ich es noch nicht da man die verschachtelten if/else-Konstrukte zwar auslesen kann, man dann aber immernoch die einzelnen Anweisungen voneinander Trennen muss da man eben nur das komplette if/else-Konstrukt mit allen Verschachtelungen als ganzes auslesen kann. |
#32
| |||
| |||
Na ja. Da bleibe ich lieber dabei die einzelnen Zweige nochmal zu parsen. __________________ Patrick Gotthardt Patrick Gotthardt on Software |
#33
| ||||
| ||||
Zum Thema: * http://www.massassi.com/php/articles/template_engines/ * http://www.massassi.com/bTemplate/benchmarks/ Und wenn wir schon dabei sind: * http://www.sitepoint.com/forums/atta...achmentid=6772 __________________ Philipp Gérard Gewöhnliche Menschen denken nur daran, wie sie ihre Zeit verbringen. Ein intelligenter Mensch versucht sie zu nützen. - Arthur Schopenhauer |
#34
| ||||
| ||||
Interessante Links, danke Den ersten Artikel kannte ich schon, aber die anderen beiden sind mir neu. |
#35
| |||
| |||
Na ja. Kannte den ersten ebenfalls. Hätte mich fast in's schwanken gebracht, damals. Den letzten Link werde ich mir bei Zeiten nochmal genauer durchlesen. Wenn XML von den Browsern besser supported wäre bräuchte man keine Template-Engine. Dann würde man die Ausgaben einfach in XML machen und den Kunden die Möglichkeit geben eine XSLT- oder CSS-Datei zu modifizieren... naja... aber das scheint ja noch etwas zu dauern. __________________ Patrick Gotthardt Patrick Gotthardt on Software |
#36
| ||||
| ||||
Nein, die XML/XSLT-Lösung funktioniert bereits. __________________ Philipp Gérard Gewöhnliche Menschen denken nur daran, wie sie ihre Zeit verbringen. Ein intelligenter Mensch versucht sie zu nützen. - Arthur Schopenhauer Geändert von Philipp Gérard (01.06.2004 um 13:53 Uhr). |
#37
| |||
| |||
Ich bin zwar kein Fan davon, aber irgendwo muss man ja auch an die älteren Browser denken, oder? Aber eigentlich hast du recht... ich könnt mal was mit XML als Ausgabe basteln. BTW: Sicher, dass das XSS heißt? __________________ Patrick Gotthardt Patrick Gotthardt on Software |
#38
| ||||
| ||||
@TheDragonMaster: Hm, ich komm irgendwie auf keine allzu sinnvolle Lösung - wie hast du das denn gelöst? |
#39
| |||
| |||
Ich hab momentan auch keine "Up-To-Date"-Variante mehr. Zumindest keine getestete. " Generell musst du aber nur nochmal den If-Parser über die Zweige der Bedingungen drüber jagen. Das sollte schon reichen. __________________ Patrick Gotthardt Patrick Gotthardt on Software |
#40
| ||||
| ||||
Übrigens scheint die REGEX für Elseanweisungen noch etwas verbugt zu sein. Die Runtime beim Output meiner Website ist mit der else-REGEX 2,8s, ohne 0,02s. |
#41
| ||||
| ||||
Hallo, mit verschachtelten IF's hab ich's jetzt auch hinbekommen, aber sicherlich ganz anders als vermutet: Ich habe mit strpos, substr() und substr_replace() jedem IF eine ID zugewiesen, wobei jede else bzw. /if-Anweisung die ID des letzten IF's bekommt. Dies geschieht beim ersten Laden des Templates. Anschließend (wenn man das Template ausgeben will) wird der folgende REGEXP drüber gejagt: /\{if (\d+) (.*)\}(.*)\{else \\1\}(.*)\{\/if \\1\}/sieU bzw. /\{if (\d+) (.*)\}(.*)\{\/if \\1\}/sieU wobei \\1 die ID ist, die jeden "If-Tag" identifiziert und somit einzigartig macht. Ich möchte nun aber auch Schleifen einbauen, also beispielsweise foreach. Das Problem ist, dass man auch If in Schleifen verwenden können soll und umgekehrt (also Schleifen zwischen {if ...} und {/if}. Wenn ich das aber nacheinander parse (also nacheinander einen REGEXP für If und danach einen für Schleifen drüberjage), dann funzt If in Schleifen nicht. Wenn ich erst Schleifen parsen würde und dann If würde wiederum Schleifen zwischen {if} und {/if} nicht funktionieren. Hat jemand eine Idee, wie man das lösen könnte? |
#42
| ||||
| ||||
Ich hol das Thema nochmal hoch weil es für mich grade Interessant wird Ich hab leider komplett die Übersicht verloren deswegen wäre es für mich ganz nützlich wenn mir jemand kurz nochmal das komplette, funktionierende Script posten könnte |
Stichworte |
- |