Zur Boardunity Forenstartseite
  #1  
Alt 17.02.2005, 18:21
Mitglied
 
Registriert seit: 01.2005
Beiträge: 137

html in php wandeln


Ich will TPL-Befehle und html-Seiteninhalte in php wandeln, so das diese in eine php-Datei geschrieben werden können bzw mit eval ausgeführt werden können.
Ich bin mir aber nicht ganz sicher ob ich das richtig angehe und würde da gern mal das Grundprinzip erklärt bekommen...
Muss ich den Code per echo ausgeben oder einfach per return in den code zurückgeben?...
Kann mir mal jemand unter die Arme greifen?
Nur mal das Grundprinzip, damit ich da mal von einer richtigen Grundlage ausgehe...

MfG
  #2  
Alt 18.02.2005, 09:07
Mitglied
 
Registriert seit: 01.2005
Beiträge: 137
Als Markierungen könnte ich z.B.
PHP-Code:
?> 
und
PHP-Code:
<?php
nutzen.
Alles zwischen ?> und <?php sollte dann als echo ausgegeben werden. Damit es keine Probleme mit ' oder " usw gibt, benutze ich noch addslashes, um diese zu escapen...

Die Funktion die das durchführen soll, gibt aber immer nur
PHP-Code:
echo 'der text 
statt
PHP-Code:
echo 'der text'
zurück, wodurch das nicht funktionieren kann...

Kann mir jemand helfen?

Sorry wegen der ungenauen Beschreibung, mir fehlte das erste mal die Zeit

  #3  
Alt 18.02.2005, 10:34
Mitglied
 
Registriert seit: 10.2003
Ort: Bottrop
Beiträge: 777
Es gibt mehrere Möglichkeiten:

a) Du nimmst Smarty oder etwas ähnliches.
b) Du zeigst uns, was du bisher hast, damit wir einen Fehler finden können.

__________________
Patrick Gotthardt
Patrick Gotthardt on Software
  #4  
Alt 18.02.2005, 11:24
Mitglied
 
Registriert seit: 01.2005
Beiträge: 137
Ok, ich habe noch einiges zu testen und getestet, sollte das gemacht sein, poste ich mal einen Zwischenstand hier

  #5  
Alt 21.02.2005, 11:23
Mitglied
 
Registriert seit: 01.2005
Beiträge: 137
IF, ELSEIF, ELSE, ENDIF => funktioniert
Variablen aller Art => funktionieren (z.B. $this->var['test'] als {var->test})
include: $file => funktioniert ($file muss in $this->inc['variable'] stehen)

Problem:
Seitenlayout getrennt von Content parsen und cachen (in arbeit)
Foreach-Schleifen (noch kein Lösungsansatz)

Weitere geplante Featuren:
BB-Code
Smilies


Das TPL wird in einer php-Datei gespeichert (ohne html-Bereiche, reines php)

Foreach-Schleifen:
PHP-Code:
{foreach: $variable}das ausgebenauch mit variablen...{/foreach} 
Bin noch nicht darauf gekommen, wie ich die Schleifen realisieren kann, so das auch Variablen korrekt ausgegeben werden können.

  #6  
Alt 23.02.2005, 10:25
Mitglied
 
Registriert seit: 01.2005
Beiträge: 137
Wie kann ich mit preg_replace nach folgenden SUchmustern suchen (mit oder verknüpft):
PHP-Code:
echo ''// ohne Leerzeichen zwischen '

echo ' '// ein Leerzeichen zwischen '

echo '
'
// mit Zeilenumbruch 
Meine Probleme hab ich da mit dem Zeilenumbruch, der Rest an sich würde, wenn auch nicht unbedingt optimal, funktionieren...
Oder-Verknüpfung ist klar (|), aber wie bekomm ich das zusammen das es auch funktioniert?
Leerzeichen könnte '/w' und Zeilenumbruch '/n' sein, aber das habe ich in verschiedenen Kombinationen schon ausprobiert, ohne erfolg...

Mein Code:
PHP-Code:
$this->template_code preg_replace('/echo (\'\'|\' \');|\'\'\./ise'' '$this->template_code); 


Geändert von eBoy (23.02.2005 um 11:31 Uhr).
  #7  
Alt 23.02.2005, 11:45
Benutzerbild von exe
exe exe ist offline
titellos
 
Registriert seit: 07.2003
Ort: München
Beiträge: 867
Du könntest statt \w und \n einfach \s für generelle "Space"-Charaktere verwenden. Das schliesst zwar auch Tabs (\t) mit ein aber das macht ja nix.
Die Oder-Verknüpfung kannst du dir auch sparen indem du einfach \s? schreibst. Das heisst dann "entweder ein Space oder gar nichts".

Der Reguläre Ausdruck (ungetestet):

PHP-Code:
$this->template_code preg_replace('/echo \'\s?\';/i'' '$this->template_code); 
Wenn nicht nur ein Leerzeichen oder Zeilenumbruch zwischen den Anführungszeichen stehen kann machst du statt ? einfach *:

PHP-Code:
$this->template_code preg_replace('/echo \'\s*\';/i'' '$this->template_code); 

__________________
Johannes Klose
Calitrix Wiki - Wiki auf Basis von PHP und MySQL
  #8  
Alt 23.02.2005, 12:45
Mitglied
 
Registriert seit: 01.2005
Beiträge: 137
Mh, funktioniert mal nicht auf anhieb...
Problemzeile:
PHP-Code:
'; include ($this->inc['test_inc']); echo '
'; include ($this->inc['
html_inc']); 
Ende Zeile 1, Anfang Zeile 2 ergibt zusammen ein leeres und somit unnötiges echo, das entfernt werden soll. Zur genaueren Erklärung
Ich werde zwar nochmal rumprobieren, aber die ersten Versuche waren so ebenfalls erfolglos

  #9  
Alt 23.02.2005, 13:16
Benutzerbild von exe
exe exe ist offline
titellos
 
Registriert seit: 07.2003
Ort: München
Beiträge: 867
Also bei mir funktioniert das einwandfrei. Ich habs mit folgendem Codeschnippsel getestet:

PHP-Code:
<?PHP
$text 
"'; include (\$this->inc['test_inc']); echo '
'; include (\$this->inc['html_inc']); "
;

$text preg_replace('/echo \'\s?\';/i'' '$text);
echo 
$text;
?>
Ausgabe:

Code:
'; include ($this->inc['test_inc']);   include ($this->inc['html_inc']);

__________________
Johannes Klose
Calitrix Wiki - Wiki auf Basis von PHP und MySQL
  #10  
Alt 23.02.2005, 14:04
Mitglied
 
Registriert seit: 01.2005
Beiträge: 137
Mh, hast du das unter Linux oder Windows getestet? Ich habe es unter Windows probiert, was wohl das Problem war...
Somit werde ich es nochmals probieren und den Fehler diesmal nicht mehr machen

  #11  
Alt 23.02.2005, 14:48
Benutzerbild von exe
exe exe ist offline
titellos
 
Registriert seit: 07.2003
Ort: München
Beiträge: 867
Das wird wohl das Problem sein.
Windows benutzt als Zeilenumbruch \n\r während Linux nur \n nimmt. Scheinbar ist \r bei Regulären Ausdrücken nicht in \s enthalten.
Folgendes sollte auch unter Windows und Macs funktionieren:

PHP-Code:
$this->template_code preg_replace('/echo \'(\s|\n\r|\r)?\';/i'' '$this->template_code); 

__________________
Johannes Klose
Calitrix Wiki - Wiki auf Basis von PHP und MySQL
  #12  
Alt 24.02.2005, 07:22
Mitglied
 
Registriert seit: 01.2005
Beiträge: 137
Ok, das hat sich erledigt...
Ich habe mir schon einen Zeilenumbruch eingebaut (<br>), dieser wurde verarbeitet und dann durch den regulären Ausdruck (wieso auch immer) nicht entfernt. Wenn ich den Zeilenumbruch wieder raus nehme, funktioniert das ganze...
Somit war es wohl oder übel mein Fehler

  #13  
Alt 11.03.2005, 10:20
Mitglied
 
Registriert seit: 01.2005
Beiträge: 137
Die Funktionen des Parsers stehen (if, elseif, variablen, foreach, include) und einfaches Caching ist auch schon integriert. Jetzt muss um das ganze herum noch eine funktionierende TPL-Klasse gebaut werden.

Hinzukommen soll noch:
BB-Code


Das wird aber dauern, da ich nebenher noch in anderen Projekten tätig bin...
Diese Klasse will ich für mein nchfolgendes Projekt nutzen, was aber noch lange nicht begonnen wird...

  #14  
Alt 30.03.2005, 09:55
Mitglied
 
Registriert seit: 01.2005
Beiträge: 137
Ich habe das TPL-System völlig umgekrempelt und vereinfacht, was auch scheinbar funktioniert. Dazu habe ich jetzt ein BB-Code Parser angefangen. B-, U- I-Tags funktionieren bereits, aber ich habe Probleme mit einem Schriftfarbe-Tag...
PHP-Code:
'/\[color=(.*?)\](.*?)\[\/color\]/is' // Such-Ausdruck
'<font color=\"\\1\">\\2</font>' // Ersatz-Ausdruck 
Wenn ich nun einen so formatierten Text über mein TPL-System ausgebe, wird die Schriftfarbe nicht auf die gewünschte geändert, sondern die genutzt, die per CSS für Text definierte Farbe benutzt.
Woran liegt das? Oder ist in meinem php-Code oben ein Fehler?

[EDIT]
Das gleiche Problem habe ich auch mit einem CENTER-Tag (egal ob in DIV oder SPAN gewandelt)
[/EDIT]


Geändert von eBoy (30.03.2005 um 11:41 Uhr).
  #15  
Alt 30.03.2005, 12:36
Benutzerbild von exe
exe exe ist offline
titellos
 
Registriert seit: 07.2003
Ort: München
Beiträge: 867
Wenn du einen PHP-String in einfache (') Anführungszeichen setzt musst du innerhalb dieses Strings doppelte (") Anführungszeichen nicht mit Backslash entschärfen (in diesem Fall wird der Backslash normal ausgegeben). Das gleiche gilt andersrum: in einem String, der mit doppelten Anführungszeichen umschlossen wird, werden einfache Anführungszeichen nicht mit Backslash entschärft.

Daher kommt bei deinem Parser beispielsweise

Code:
<font color=\"blue\">fooblau</font
raus, was einen Browser sicherlicht nicht sehr freut. Übrigens musst du, wenn der Ersetzungsstring in einfache Anführungszeichen gesetzt wird, keine doppelten Backslashes verwenden um auf eine Backreference (\\1, \\2 usw.) zuzugreifen.

Ändere den Ersetzungsstring auf

Code:
'<font color="\1">\2</font>'
dann sollte alles funktionieren.

__________________
Johannes Klose
Calitrix Wiki - Wiki auf Basis von PHP und MySQL
  #16  
Alt 30.03.2005, 13:01
Benutzerbild von Gardan
7th BBS
 
Registriert seit: 03.2005
Ort: München
Beiträge: 42
Übrigens kann man per regulären Ausdrücken keine verschachtelten Tags behandeln. Du solltest das ganze erstmal in Token zerlegen und dann unter Zuhilfenahme eines Stacks abarbeiten.

  #17  
Alt 30.03.2005, 16:52
Mitglied
 
Registriert seit: 01.2005
Beiträge: 137
Ich habe die unnötigen Backslashes entfernt und das ganze mit style gelöst. Also css anstatt html.
Jedenfalls funktioniert das nun mit der css- Lösung

Antwort


Stichworte
-

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Gutes php Wiki Daniel Richter Blog, CMS, Wiki und Sonstige 21 13.12.2009 12:56
Suche jemanden mit HTML + PHP Kenntnissen Jochen2003 Boardunity-Talk 9 11.02.2005 11:48
Zend's PHP 5 Programmierwettbewerb... Fabchan Programmierung und Datenbanken 9 14.07.2004 22:37
aktuelle PHP 4 / 5 Bücher Philipp Herbers Programmierung und Datenbanken 10 15.06.2004 00:18
Das PHP Forum 4 all ShadowByte Projektvorstellung und Bewertung 4 22.06.2003 21:12






1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24