Preg_match Pattern Problem

nchristoph

Erfahrenes Mitglied
Hallo zusammen,

ich brüte gerade wieder bei einem preg_match Pattern und irgendwie krieg ich es nicht richtig zum laufen.

Ich will, dass eine Datei durchsucht wird und bei einem Treffer durch einen Array ersetzt wird.

Hier mal mein Preg_match Aufruf:

PHP:
preg_replace('/%([^}]*)}/', "<?=\$lang['$1'];?>"

Das ganze ist Teil meiner Templateengine und für die Sprachvariablen zuständig.

Wenn ich die die Sprachvariable auf ein Contentbezogenes Template anwende funktionierts wie geschmiert.
Sobald ich das allerdings auf ein Modulbezogenes Template anwende, krieg ich folgende Fehlermeldung:
Code:
Notice: Undefined variable: lang in C:\xampp\cms\modules\mod_archive\front_archive.php(2) : eval()'d code on line 2

Die Datei mit den Sprachvariablen ist eingebunden und $lang habe ich mir schon ausgeben lassen, der Array is auch gefüllt.

Hat einer ne Idee, was da Falsch läuft?
 
Dein Pattern:
Code:
/%([^}]*)}/
ist Fehlerhaft: die geschwungende Klammer am Ende ist nicht escapet.
Deine Platzhalter sehen also so aus: %...} ?

PHP:
<?php
preg_replace('/%([^}]*)}/', "<?=\$lang['$1'];?>"

Das sieht ja mal ganz wirr aus. Im PHP Code noch neuen PHPCode zu starten, bzw in einem String eine echo Ausgabe zutätigen (<?=), da scheint es mir fast als wären da Grundlagen fällig...
Versuche es eventuell mal so:
PHP:
preg_replace('/%([^}]*)\}/', $lang["$1"]);
 
Hallo timestamp,

ich muss ehrlich zugeben, ich hab das noch nicht ohne die Echo Ausgabe versucht.

Danke für die Hilfe beim Pattern, ich muss mir da wirklcih mal ein Buck oder ähnliches zu besorgen.

Die Templates sind reiner HTML code ausgenommen die Platzhalter für Variablen bzw. für Sprachvariablen.

Wie soll ich das sonst machen? Nur so als Frage?

//EDIT: Ohne die Echo Ausgabe kommt immer : Undefinded Variable lang .
 
Zuletzt bearbeitet:
In einer ausgegliederten Datei die über Require eingebunden wird.
PHP:
<?php
$lang = array();
$lang['archive_error'] = 'Keine Eintr&auml;ge vorhanden'; 
$lang['publishedon'] = 'Ver&ouml;ffentlicht am';
$lang['by'] = 'von';
$lang['entire_post'] = 'Ganzen Beitrag anzeigen';
$lang['category'] = 'Kategorie';
$lang['comment'] = ' Kommentar';
$lang['comments'] = ' Kommentare';
$lang['archivfor'] = 'ARCHIV F&Uuml;R';
$lang['back'] = 'Zur&uuml;ck';
$lang['captchaerror'] = 'Fehler: Der Code war falsch';
$lang['categerror'] = 'Keine eintr&auml;ge vorhanden';
$lang['categoverview'] = '&Uuml;bersicht f&uuml;r Kategorie';
$lang['name'] = 'Name:';
$lang['email'] = 'E-Mail:';
$lang['search_error'] = 'Keine Treffer';
$lang['search_result'] = 'Suchergebnis';
$lang['wrote_on'] = 'schrieb am';
$lang['no_entries'] = 'Keine eintr&auml;ge vorhanden';
$lang['newcomment'] = 'Neues Kommentar schreiben';
$lang['website'] = 'Website';
$lang['content'] = 'Content';
$lang['security'] = 'Sicherheitsabfrage';
$lang['archive'] = 'Archiv';
?

Danke für das Tut, habs schon gebookmarked
 
Ich sehe gerade du benutzt eval?
Davon ist ganz stark abzuraten, sehr unsicher, außerdem sind dort vorher definierte Variablen in dem mit Eval ausgeführten Code nicht definiert.
Zeig doch mal bitte den Code mit dem einbinden auf aufrufen der preg_replace Funktion.
 
Ja eval ist leider momentan nötig, damit die Templates richtig geparst werden.

Das Problem will ich als nächstes angehen.

Ich habe das mit den Sprachvariablen so gelöst:

Im Module_Manager habe ich mir eine Funktion geschrieben, die im Language Ordner nachsieht, ob eine Sprachvariable da ist und wenn sie existent ist prüft, ob die Datei Daten enthält.

Wenn beides nicht zutrifft, werden einfach das % und die } vom String gelöscht und nur der string ausgegeben.

Danke für die Hilfe.
 
Und wie wäre es so?
PHP:
$lang = array();
//...

$file = file_get_contents('mein_template.txt');
$file = preg_replace($pattern, $replace, $file);

Verstehe das eval nicht.
 
Vielleicht solltest du dir mal CakePHP und das Buch "Webentwicklung mit CakePHP (2te Auflage)" angucken. Kostet kaum was (20 Euro das Ebook) und du kannst es dir sparen selbst mit Templateengines zu arbeiten. Da kannst du nach dem MVC Model arbeiten und dir Layouts für alle Fälle einfach selbst zusammen bauen. Ist wirklich sehr einfach und schnell reinzukommen, wird spitze erklärt und ist auch für Neulinge gut verständlich.

Hier ein Link - falls Interesse besteht:
http://www.oreilly.de/catalog/pdf_cakephpwebentw2ger/index.html
 
Danke für den Hinweis Sebastian aber ich will von Frameworks und fertig CMS abstand nehmen.

Die sind immer so Stur und teilweise nur umständlich zu erweitern, da bau ich mir lieber selber was.

Muss ich sowieso für den Kurs.

Danke für die Hilfe.

Achja: timestamp, du hast Post.
 
Zurück