Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   PHP {Variable} (https://www.delphipraxis.net/137574-php-%7Bvariable%7D.html)

youuu 23. Jul 2009 17:35


PHP {Variable}
 
Hi, wie kann ich es bewergstelligen wenn ich per

Delphi-Quellcode:
$nachricht=file_get_contents("nachricht.txt");
und die NAchricht so aus diesen Text besteht:

Email: {email}
Homepage: {homepage}
Telefonnummer: {telefon}
------------------------------------

Nachricht: {nachricht}


das was in diesen klammern steht als Variable erkannt wird?

Die Muhkuh 23. Jul 2009 17:42

Re: PHP {Variable}
 
Du könntest mit str_replace danach suchen und entsprechend ersetzen.

youuu 23. Jul 2009 17:46

Re: PHP {Variable}
 
Das habe ich mir auch gedacht, nur in was muss ich es ersetzen damit php es als Variable erkennt?
Das sind meine ersten php Versuche ;)

Als ich in der txt direkt $variable geschrieben habe, wurde dies nicht als variable erkannt.

Die Muhkuh 23. Jul 2009 17:50

Re: PHP {Variable}
 
Code:
$nachricht=file_get_contents("nachricht.txt");
$nachricht = str_replace('{email}', $email, $nachricht);
In $email steht der Inhalt drin, der nachher in der Nachricht drin stehen soll.

generic 23. Jul 2009 17:55

Re: PHP {Variable}
 
du solltest eine Templateengine nehmen, das ist performater als ein Replace.

Smarty und PEAR:DB - das DreamTeam

Im aktuellen PHP User Magazin ist auch gerade ein neuerer Artikel über das Thema von mir.

youuu 23. Jul 2009 17:59

Re: PHP {Variable}
 
Nur wie mach ich dies variable, so das ich das nicht hundert mal hinter einander setzen muss?

Dax 23. Jul 2009 18:00

Re: PHP {Variable}
 
Mit einer Schleife.

youuu 23. Jul 2009 18:02

Re: PHP {Variable}
 
Zitat:

Zitat von generic
du solltest eine Templateengine nehmen, das ist performater als ein Replace.

Smarty und PEAR:DB - das DreamTeam

Im aktuellen PHP User Magazin ist auch gerade ein neuerer Artikel über das Thema von mir.

Hierbei geht es eigentlich lediglich um ein Kontaktformular, ich denke das wäre dann soetwas wie mit Kanonen auf Spatzen schießen oder irre ich mich da?

jfheins 23. Jul 2009 18:03

Re: PHP {Variable}
 
Ich habe das so gelöst:
Code:
function parse_tpl ($templates, $values = array())
{
   if (!is_array ($templates))
   {
      $templates = explode (',', $templates);
   }

   foreach ($templates as $template)
   {
      @ $tpl_text .= "\r\n\r\n" . file_get_contents($_SESSION['tplpath'] . $template . '.tpl');
   }

   $GLOBALS['tpl_resarr'] = $values;

   $tpl_text = preg_replace ('/\{tpl\|(.+?)\}/e', '$GLOBALS[\'tpl_resarr\'][\\1];', $tpl_text);

   unset ($GLOBALS['tpl_resarr']);

   echo $tpl_text;
}

parse_tpl ('header,menu', array ('sitename' => $sitename));
Das ist eine Funktion zum parsen von templates. Im Template steht dann sowas wie {tpl|sitename} was dann ersetzt wird falls der Wert im Array auftaucht.
das mit dem tpl| hatte ich vorgesehen, um auch im template noch geschweifte Klammern verwenden zu können (falls da z.B. noch Javascript drin ist)

Die ersetzung erfolgt durch preg_replace, was in meinen Augen besser geeignet ist als str_replace, da man den regulären Ausdruck relativ einfach erweitern/anpassen kann.

youuu 23. Jul 2009 18:04

Re: PHP {Variable}
 
Zitat:

Zitat von Dax
Mit einer Schleife.

Das ist mir klar nur wie genau? ;)

das hab ich


Code:
                foreach(???)
      {
         $nachricht=str_replace("{" ??? "}",${"???"},$nachricht);
      }

Zwoetzen 23. Jul 2009 19:31

Re: PHP {Variable}
 
Das sollte dann ungefähr so aussehen:
Code:
$string = file_get_contents("nachricht.txt");
foreach(array('email', 'homepage', 'telefon', 'nachricht') as $var) {
  $string = str_replace('{'.$var.'}', $$var, $string);
}
Vielleicht noch als Erklärung:
$$var greift auf die Variable zu, die in $var steht, also in diesem Fall jeweils auf $email, $homepage, $telefon und $nachricht. Letzteres ist der Grund, weshalb ich dein $nachricht in ein $string umbenannt habe, um eine Kollision gleicher Variablennamen zu vermeiden ;)

Christian V. 23. Jul 2009 22:01

Re: PHP {Variable}
 
Zitat:

Zitat von youuu
Das habe ich mir auch gedacht, nur in was muss ich es ersetzen damit php es als Variable erkennt?
Das sind meine ersten php Versuche ;)

Als ich in der txt direkt $variable geschrieben habe, wurde dies nicht als variable erkannt.

Mit file_get_contents geht das gar nicht. Es liest bloss den Inhalt einer Datei aus, ohne sie zu interpretieren.

Zwoetzen's Beispiel zeigt, wie man mit wenig Code dein Problem lösen kann. Falls du jedoch komplexere Templates willst(z.B. mit Logik), dann kannst du das folgendermassen lösen:
ob_start();
include 'nachricht.txt.;
$nachricht = ob_get_clean();


Damit dies funktioniert, musst du aber in nachricht.txt den normalen PHP-Syntax verwenden: <?php echo $email ?> etc, oder:
<?php echo <<<PARSEEND
Email: $email
Homepage: $homepage
Telefonnummer: $telefon
------------------------------------

Nachricht: $nachricht
PARSEEND
?>

Dies ist Heredoc-Syntax
http://ch.php.net/manual/en/language...syntax.heredoc

generic 24. Jul 2009 08:43

Re: PHP {Variable}
 
Zitat:

Zitat von youuu
Zitat:

Zitat von generic
du solltest eine Templateengine nehmen, das ist performater als ein Replace.

Smarty und PEAR:DB - das DreamTeam

Im aktuellen PHP User Magazin ist auch gerade ein neuerer Artikel über das Thema von mir.

Hierbei geht es eigentlich lediglich um ein Kontaktformular, ich denke das wäre dann soetwas wie mit Kanonen auf Spatzen schießen oder irre ich mich da?

Ach NUR ein Kontakt-Formular

Da sehe ich doch schon viele GROßE Probleme auf dich zu kommen.
Formulare ist das schwierigste was es im Web gibt!

PHP ist gut um schnell etwas hin zu bekommen, nur leider muss das was dort gemacht wird auch Hand und Fuß haben. Mit PHP kann man schnell unsicher Programmieren. Besonders gefährlich ist es wenn man neu in PHP einsteigt, so kennt man die Standardangriffe nicht.
Wenn du jetzt sagt, ach mein Server wird nicht angegriffen, dann irrst du. Jeder Server wird angegriffen! Da laufen Millionen von Bots durch Netz und suchen nach Lücken und Formularen. Das machen die natürlich vollautomatisch.

Du solltest folgende Dinge beachten:
  • ist das Formular kundenfreundlich? bei Fehler werden die Felder wieder ausgefüllt und wird gezeigt was der Kunde falsch gemacht hat
  • kann das Formular missbraucht werden mit Cross Site Scripting (XSS)
  • kann das Formular missbraucht werden als Spam Releay
  • ist dein Formular sicher gegen SQL Injections (wenn SQL genutzt wird)
  • kann das Formular missbraucht werden um deinen Server kaputt zu machen bzw. Daten abzurufen, welche normal nicht zugänglich sind
  • wie werden die Daten zu dir übermittelt (mail/http/sms/sql)?
  • werden die Kundendaten verschlüsselt -> Thema Datenschutz

mquadrat 24. Jul 2009 09:54

Re: PHP {Variable}
 
Zitat:

Zitat von generic
du solltest eine Templateengine nehmen, das ist performater als ein Replace.

Wieso? Jede Template-Engine, die selber auch in PHP geschrieben ist verwendet doch die gleichen Befehle zum Suchen und Ersetzen. Teilweise wird noch ein interner DOM aufgebaut.. Also performanter kann das nicht sein. Aufgrund des Abstraktionsaufwands würde ich sogar eher auf langsamer tippen (hab jetzt allerdings keine Benchmarks). Wenn man dann noch mit Sub-Templpates arbeitet wird's richtig langsam.

generic 24. Jul 2009 11:16

Re: PHP {Variable}
 
Zitat:

Zitat von mquadrat
Zitat:

Zitat von generic
du solltest eine Templateengine nehmen, das ist performater als ein Replace.

Wieso? Jede Template-Engine, die selber auch in PHP geschrieben ist verwendet doch die gleichen Befehle zum Suchen und Ersetzen. Teilweise wird noch ein interner DOM aufgebaut.. Also performanter kann das nicht sein. Aufgrund des Abstraktionsaufwands würde ich sogar eher auf langsamer tippen (hab jetzt allerdings keine Benchmarks). Wenn man dann noch mit Sub-Templpates arbeitet wird's richtig langsam.

Nein, Nein und Nein.

Klar gibt es nicht optimale Lösungen, das sind auch genau die, welche du erwähnst.

Smarty in diesem Beispiel ist anders.

Smarty nutzt auch Templates und baut diese irgendwie zusammen. Das macht jede Templateengine.
Die Templates sind auch eigentlich nur für den Designer, damit dieser designen kann und sich nicht mit PHP Code rumärgern muss. Templateengines helfen dir auch, deinen Code sauber von der Anzeige zu trennen. Ergebnis ist besser wartbarer Code.

Smarty erzeugt aus einen Template PHP Code, welcher zwischen gespeichert wird.
Das hat viele Vorteile! Das Parsen des Templates entfällt (es sei den das Template hat sich geändert) und das in PHP vorliegende Template kann über APC oder ZendOptimizer weiter optimiert werden, da der "PHP-Compiler/Parser" nicht mehr aufgerufen werden muss.

Dadurch ist Smarty flink.

Du gewinnst durch Templateengines noch vieles mehr.
Du kannst viel leichter deine Ausgaben steuern, formatieren und umwandeln.
Natürlich kannst du auch einfach den Output Cachen, was zu weiteren Geschwindigkeitsvorteilen führt.

"Abstraktionsaufwands" vs "Wartbarkeit und Wiederverwendbarkeit"
Die meisten Systeme und Frameworks setzten inzwischen auf das MVC Pattern.
Du kannst aber auch schmale Lösungen wählen.

mquadrat 24. Jul 2009 11:34

Re: PHP {Variable}
 
@generic

Die Argumente für eine Template-Engine sind mir durchaus klar ;) Ich arbeite in meinen Projekten mit einer eigenen Engine, inkl. UI Control Framework, DataBinding etc etc... MVC hat nichts mit dem Parsing von Template-Engines allgemein zu tun. Bytecode-Caching kann / sollte man immer verwenden. Darum geht's in diesem Thema ja auch gar nicht.

Ich merkte nur an, dass man nicht allgemein sagen kann, dass eine Template-Engine, die in PHP geschrieben ist schneller ist als PHP Code ;) Das in einer Engine ggf. noch Mechanismen zum Vermeiden des Parsings enthalten sind ist sinnvoll und im Ergebnis ist die Anwendung tatsächlicher performanter. Das eigentliche Parsing aber eben halt nicht, dafür müsste die Engine wohl als PHP Extension ausgelegt sein.

Was mich zu der Frage bringt: Gibt es eigentlich Template Engines, die als PHP Extension implementiert sind? Das wäre aber wohl eher ein Punkt für ein eigenes Thema.


Die Frage des Thread-Erstellers ist auf jeden Fall durch die Möglichkeiten

- Stringfunktionen
- RegExp
- Template-Engine

beantwortet.

generic 24. Jul 2009 12:15

Re: PHP {Variable}
 
Zitat:

Zitat von mquadrat
- Stringfunktionen
- RegExp
- Template-Engine

Ich würde von der Benutzung von Stringersetzungsroutinen absehen.
Schneller geht es wenn die Platzhalter in PHP Syntax geschrieben werden.
<?php echo $var?> oder die Kurzform <?=$var?>.

Dann das Template einfach mit "include" einbinden und dabei ausgeben lassen.
Das sollte immer noch einfacher und schnell sein, als per suchen und ersetzen.

mquadrat 24. Jul 2009 12:16

Re: PHP {Variable}
 
@generic

stimmt :oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz