Boardunity & Video Forum

Boardunity & Video Forum (https://boardunity.de/)
-   Programmierung und Datenbanken (https://boardunity.de/programmierung-datenbanken-f23.html)
-   -   html in php wandeln (https://boardunity.de/html-php-wandeln-t2835.html)

eBoy 17.02.2005 18:21

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

eBoy 18.02.2005 09:07

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

Patrick Gotthardt 18.02.2005 10:34

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.

eBoy 18.02.2005 11:24

Ok, ich habe noch einiges zu testen und getestet, sollte das gemacht sein, poste ich mal einen Zwischenstand hier ;)

eBoy 21.02.2005 11:23

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.

eBoy 23.02.2005 10:25

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); 


exe 23.02.2005 11:45

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); 


eBoy 23.02.2005 12:45

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

exe 23.02.2005 13:16

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']);

eBoy 23.02.2005 14:04

Mh, hast du das unter Linux oder Windows getestet? Ich habe es unter Windows probiert, was wohl das Problem war... :rolleyes:
Somit werde ich es nochmals probieren und den Fehler diesmal nicht mehr machen ;)

exe 23.02.2005 14:48

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); 


eBoy 24.02.2005 07:22

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 ;)

eBoy 11.03.2005 10:20

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

eBoy 30.03.2005 09:55

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]

exe 30.03.2005 12:36

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.

Gardan 30.03.2005 13:01

Ü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.

eBoy 30.03.2005 16:52

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 ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:25 Uhr.

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