PHP: markierte Wörter in String logisch ersetzen

Diskutiere PHP: markierte Wörter in String logisch ersetzen im Web & Grafik Forum im Bereich Internet & Telekomunikation Forum; Hallo, angenommen in einer Datei ist ein Text, der markierte Wörter enthält. In meinem Fall sind die Wörter durch "§§" eingeschlossen also z.B...
  • PHP: markierte Wörter in String logisch ersetzen Beitrag #1
DanielxK48x

DanielxK48x

Bekanntes Mitglied
Dabei seit
02.06.2000
Beiträge
1.376
Reaktionspunkte
1
Ort
das weis keiner...
Hallo,

angenommen in einer Datei ist ein Text, der markierte Wörter enthält.
In meinem Fall sind die Wörter durch "§§" eingeschlossen also z.B.: Hallo §§anrede§§

Ich lade diese Datei nun mit PHP so ein: $content = file_get_contents("datei");

Nun möchte ich, dass alle Wörter, die mit §§ eingeschlossen sind automatisch durch die namensgleiche Variable ersetzt wird.
Also in dem oberen Beispiel sollte aus §§anrede§§ dann $anrede werden bzw. der Inhalt aus $anrede.

Natürlich könnte ich das einzeln zb. so machen: $content = str_replace ("§§anrede§§",$anrede, $content);
Aber der Aufwand wäre zu groß und außerdem sind nicht immer alle markierten Wörter vorher bekannt, die in der Datei vorkommen.

Direkt die Variablen in die Datei zu schreiben bringt leider nichts, da diese beim Einladen in $content nicht als Variable, sondern als normaler Textinhalt ausgewertet wird.

Wer kann mir etwas weiterhelfen?
 
Zuletzt bearbeitet:
  • PHP: markierte Wörter in String logisch ersetzen Beitrag #2
Lambo-Benni

Lambo-Benni

Bekanntes Mitglied
Dabei seit
23.03.2007
Beiträge
7.601
Reaktionspunkte
3
Ort
Medizinmanndiscount
$ersetzen=true
suche nach "§§"
wenn "§§" gefunden & $ersetzen=true -> ersetze "§§" durch "$" (für die Variable) und $ersetzen=false
wenn "§§" gefunden & $ersetzen=false -> ersetze "§§" durch "" und $ersetzen=true
 
  • PHP: markierte Wörter in String logisch ersetzen Beitrag #3
DanielxK48x

DanielxK48x

Bekanntes Mitglied
Dabei seit
02.06.2000
Beiträge
1.376
Reaktionspunkte
1
Ort
das weis keiner...
Das wäre ja nur in einer Schleife machbar, die die ganze Datei bzw. den ganzen Content-String Zeichen für Zeichen abarbeiten muss.
Von der Performance und Aufwand her viel zu kompliziert.
Ich hab immer noch die Hoffnung, dass ich es in str_replace o.Ä. irgendwie trickreich umformulieren kann und dass dann mit einer Zeile auf den gesamten Inhalt gleichzeitig anwenden kann.
Vermutlich sucht str_replace auch Zeichen für Zeichen, aber sicherlich intern viel schneller als wenn ich das mit einer Schleife und IF-Abfragen dazwischen machen muss.
Trotzdem danke für den Tipp. :)
Gibt es noch irgendwelche Vorschläge, Ansätze, Ideen?
 
  • PHP: markierte Wörter in String logisch ersetzen Beitrag #4
futtlui

futtlui

Bekanntes Mitglied
Dabei seit
21.01.2003
Beiträge
10.439
Reaktionspunkte
2
steht denn vor dem Platzhalter immer ein Leerzeichen? Dann könntest Du [Leerzeichen]§§ durch [Leerzeichen]$ ersetzen und anschließend alle §§ rausnehmen.
 
  • PHP: markierte Wörter in String logisch ersetzen Beitrag #5
DanielxK48x

DanielxK48x

Bekanntes Mitglied
Dabei seit
02.06.2000
Beiträge
1.376
Reaktionspunkte
1
Ort
das weis keiner...
Wirklich witzige Idee :goil:, aber leider steht sehr selten ein Leerzeichen davor.
Dennoch wäre es eine Alternative, falls es keine weitere Lösung gibt, einfach Leerzeichen zu setzen.
Na mal sehen, was hier noch so an Vorschlägen kommt. ;)

Nachtrag:
Ich muss das in einem Rutsch und auch direkt durch den Inhalt der Variable erstzen!
Es muss quasi auch das Wort zwischen den §§ bekannt sein, damit es durch den Inhalt der entsprechenden Variable ersetzt wird.
Wie zb. §§anrede§§ automatisch durch Frau (Inhalt von $anrede) oder §§preis§§ durch 3,49 (Inhalt von $preis);
Von der Logik her als Beispiel:
falsch wäre: $content=str_replace("§§anrede§§", "$anrede", $content)
richtig wäre: $content=str_replace("§§anrede§§", $anrede, $content)
Ich will ja den Inhalt einer Variablen übergeben, aber dennoch die passende Variable mit Hilfe des Namens finden.
Es reicht also nicht einfach durch $variable auszutauschen sondern durch dessen Inhalt, sonst hätte ich in der Datei ja gleich Variablen einsetzen können. ;)
 
Zuletzt bearbeitet:
  • PHP: markierte Wörter in String logisch ersetzen Beitrag #6
Lambo-Benni

Lambo-Benni

Bekanntes Mitglied
Dabei seit
23.03.2007
Beiträge
7.601
Reaktionspunkte
3
Ort
Medizinmanndiscount
Du wirst nicht um das Durchsuchen des Textes drumherumkommen.

Klar, optimal wäre $content=str_replace("§§$xyz§§", "$$xyz", $content). Aber das ist (nach meinem Wissensstand) nicht machbar.

Lies den Text aus, suche dabei nach den §§, speicher den Wert temporär und ersetze gleich.

PHP:
while suche_im_Text nach "§§" {
  while !suche_im_Text nach "§§" {
    $tmp=$chars_zwischen_§§
  }
  $content=str_replace($tmp, $$tmp, $content)
}
$content=str_replace("§§", "", $content)

Früh am Morgen zusammengereimt, aber sollte funktionieren. ;)
 
  • PHP: markierte Wörter in String logisch ersetzen Beitrag #7
DanielxK48x

DanielxK48x

Bekanntes Mitglied
Dabei seit
02.06.2000
Beiträge
1.376
Reaktionspunkte
1
Ort
das weis keiner...
Das Problem ist eben, dass ich den Inhalt der Variable schreiben möchte und nicht den Namen der Variable.

Folgende Sache habe ich mir gedacht:

Ich schließe die zu markierenden Wörter mit {.. und ..} in meiner HTML-Datei ein.
HTML:
<p>Hallo {..username..}</p>

Dann lade ich den Inhalt der Seite in die Variable $con
PHP:
$con = file_get_contents(datei.htm);

Ich ersetze "{.." und "..}" in $con durch php-schnippsel:
Code:
$con = str_replace ("{..","<?echo $", $con);
$con = str_replace ("..}","?>", $con);

Aus z.B. {..username..} wird dann <?echo $username?>
Wenn ich $con aber nun mit echo oder print ausgebe wird der Inhalt von $con nicht als php-code interpretiert sondern eben direkt so ausgegeben.
Eine Lösung wäre die ganze Sache in eine Datei zu schreiben und dann mit include wieder einzubinden, damit der eingebettete php-code auch ausgeführt wird.
Ich habe das ausprobiert und das funktioniert auch tatsächlich, finde das aber schon rein aus Performance-Gründen als eine sehr schlecht Idee.
Gibt es denn eine Möglichkeit php-code, der in einer Variable steht auch interpretiert auszugeben?
Das wäre ja im Grunde die Lösung meines Problems.
 
  • PHP: markierte Wörter in String logisch ersetzen Beitrag #8
DanielxK48x

DanielxK48x

Bekanntes Mitglied
Dabei seit
02.06.2000
Beiträge
1.376
Reaktionspunkte
1
Ort
das weis keiner...
Ich habe die Sache jetzt mit eval() gelöst :)
Allerdings muss man etwas aufpassen, dass kein code von außen eingeschleusst werden kann.
Das ganze habe ich dann noch als kleine function geschrieben.
Jetzt stellt sich mir eigentlich die Frage warum man riesige Templates installieren soll mit unglaublich komplizierten Wegen, wenn mein Weg mit einem 4-Zeiler genauso funktioniert und sogar noch viel besser.
Denn ich brauche keine Variablen vorher irgendwie zu definieren usw. wie es z.B. bei smarty ist.
Ich gebe meine Template-Datei einfach mit display(datei.html) aus und fertig.
Der Rest wird automatisch durch den Inahlter der Variable ersetzt dessen Name zwischen meinen Markern steht.

Habe ich zb. eine Variable $blablabla = "nanunana"; - dann wird "nanunana" einfach an Stelle von {..blablabla..} geschrieben.
Genau das, was auch komplexe Template-Systeme machen, aber ohne diese ganzen Umwege über Klassen und Variablendefinitionen. ^^

Falls mir jemand mal erklären könnte, was für eine Berechtigung dann noch Smarty & Co hat bitte ich dies hier zu erläutern. :)

Hier meine Lösung:
PHP:
<?php
function display($tpl)
{
    extract($GLOBALS);
    $con = file_get_contents($tpl);
    $con = str_replace ("{..","<?echo $", $con);
    $con = str_replace ("..}","?>", $con);
    return eval("?>" . $con . "<?");
}
?>

Der Aufruf ist dann ganz einfach:
PHP:
display("datei.htm");
 
Zuletzt bearbeitet:
  • PHP: markierte Wörter in String logisch ersetzen Beitrag #9
Lambo-Benni

Lambo-Benni

Bekanntes Mitglied
Dabei seit
23.03.2007
Beiträge
7.601
Reaktionspunkte
3
Ort
Medizinmanndiscount
Habe ich zb. eine Variable $blablabla = "nanunana"; - dann wird "nanunana" einfach an Stelle von {..blablabla..} geschrieben.

Das tut meine Lösung doch auch.

Aber schön, dass Du eine Lösung gefunden hast. Die war mir noch unbekannt. :goil:

edit: nochmals zu meiner Lösung:
evtl gab es hier ein Missverständnis.

$$tmp ist nicht gleich "$"+$tmp.

sondern:
wenn $tmp = "blablabla"
und $blablabla = "nanunana"
dann ist $$tmp = "nanunana"

;)
 
  • PHP: markierte Wörter in String logisch ersetzen Beitrag #10
DanielxK48x

DanielxK48x

Bekanntes Mitglied
Dabei seit
02.06.2000
Beiträge
1.376
Reaktionspunkte
1
Ort
das weis keiner...
Zu der Zeit als du deine Lösung gepostet hattest fiel mir die Lösung mit eval() noch nicht ein.
Außerdem wollte ich eben ungern in Schleifen arbeiten, da das bei größeren Projekten unglaublich auf die Performance gehen würde.
Stelle dir mal die Abfrage einer langen SQL-Tabelle vor. ;)

Ich frage mich immer noch warum alle solche völlig komplizierten Template-Systeme schreiben.^^
Dabei ist doch meine Lösung sogar noch einfacher, schneller und leistungsfähiger.
Evtl. erklärt mir das mal irgendwann einer...
 
  • PHP: markierte Wörter in String logisch ersetzen Beitrag #11
S

Sady

Bekanntes Mitglied
Dabei seit
11.03.2009
Beiträge
70
Reaktionspunkte
0
Ort
Aschaffenburg
Zu der Zeit als du deine Lösung gepostet hattest fiel mir die Lösung mit eval() noch nicht ein.
Außerdem wollte ich eben ungern in Schleifen arbeiten, da das bei größeren Projekten unglaublich auf die Performance gehen würde.
Stelle dir mal die Abfrage einer langen SQL-Tabelle vor. ;)

Ich frage mich immer noch warum alle solche völlig komplizierten Template-Systeme schreiben.^^
Dabei ist doch meine Lösung sogar noch einfacher, schneller und leistungsfähiger.
Evtl. erklärt mir das mal irgendwann einer...

Hi!

Das ist ganz einfach. Dein Code ist zwar performant, aber so leider nicht alltagstauglich. Jeder Hacker würde sich da die Hände reiben. Das lässt sich auch mit einem ganz einfachen Beispiel-Platzhalter erläutern:
Code:
{..Test;phpinfo()..}

Leistungsfähigkeit ist eine Sache, aber Sicherheit ist mindestens genau so wichtig.

Gruß
:hal:
 
  • PHP: markierte Wörter in String logisch ersetzen Beitrag #12
DanielxK48x

DanielxK48x

Bekanntes Mitglied
Dabei seit
02.06.2000
Beiträge
1.376
Reaktionspunkte
1
Ort
das weis keiner...
@Sady
LOL aber wer hat denn gesagt, dass ich Formularfeldwerte direkt und unvalidiert da reinsetze?
Es wird lediglich der Inhalt von $tpl mit dem markiertem Wort ersetzt.
Der Inhalt wird selbstverständlich mit htmlspecialchars und Zeichen-Filtern (Whitelist mit Ausdrücken) vorbereitet in diese Funktion geschickt.
Außerdem wird immer nur das geparst, was bereits Inhalt der Variable ist.
Selbst wenn ich Code durch ein Eingabefeld zulassen würde würde dieser einfach als Text behandelt.
Das Eingabefeld müsste in meinem Fall ebenfalls vorher mit eval geparst werden.
In die DB wird auch nur mit mysql_real_escape_string geschrieben und natürlich mit vorherigem stripslashes falls Magic Quotes GPC aktiviert ist.
Wenn auf meinem Server SQLite laufen würde würde ich sogar noch die Sache mit Prepare-Statements absichern.
Also mangelnde Sicherheit kann man mir sicherlich nicht vorwerfen. Also bitte... :rolleyes:
 
Zuletzt bearbeitet:
  • PHP: markierte Wörter in String logisch ersetzen Beitrag #13
S

Sady

Bekanntes Mitglied
Dabei seit
11.03.2009
Beiträge
70
Reaktionspunkte
0
Ort
Aschaffenburg
Na du selbst hast das gesagt:

Hier meine Lösung:
PHP:
<?php
function display($tpl)
{
    extract($GLOBALS);
    $con = file_get_contents($tpl);
    $con = str_replace ("{..","<?echo $", $con);
    $con = str_replace ("..}","?>", $con);
    return eval("?>" . $con . "<?");
}
?>
Der Aufruf ist dann ganz einfach:
PHP:
display("datei.htm");

Und wenn du alle Sicherheitsmechanismen eingebaut hast, dann hast du mit etwas Phantasie sowas wie Smarty
 
  • PHP: markierte Wörter in String logisch ersetzen Beitrag #14
DanielxK48x

DanielxK48x

Bekanntes Mitglied
Dabei seit
02.06.2000
Beiträge
1.376
Reaktionspunkte
1
Ort
das weis keiner...
Nur das mein Code dann trotzdem nicht einmal ein 10tel so groß ist. ^^
 
Thema:

PHP: markierte Wörter in String logisch ersetzen

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.180
Beiträge
1.579.173
Mitglieder
55.879
Neuestes Mitglied
stonetreck
Oben