Zum Inhalt springen

preg_replace(): Mit Modifikator "e" Variablen auslesen - funktioniert nicht


Empfohlene Beiträge

Geschrieben (bearbeitet)

Hallo Community,

ich habe ein Problem mit preg_replace().

Und zwar möchte ich gerne gekennzeichnete Zeichenketten durch eine Variable ersetzen.

Beispiel: bla {${asd}} bla

PHP soll nun $bla auslesen und an die Stelle von {${bla}} setzen.

Das funktioniert nur nicht ganz...

Der Code:

preg_match_all('/\{\$\{([a-z][0-9_a-z]*)\}\}/i', $cont, $mtch);
foreach ($mtch[1] as $val) {
global $$val;
}
$cont = preg_replace('/\{\$\{([a-z][0-9_a-z]*)\}\}/ei', '$\1 ? $\1 : \'<!-- Missing variable: \1 -->\'', $cont);[/PHP]

Hier werden zuerst - da der Vorgang in einer Funktion ist - alle Variablen mit global geholt.

Danach sollen sie eingesetzt werden.

Ganz davon abgesehen, dass es für manche als totaler Humbug erscheinen wird, müsste es eigtl. gehen.

Edit: PS: Die Variablen exestieren - daran kanns also nicht liegen.

Er ersetzt die Zeichenketten auch, nur halt nicht durch den Wert der Variable, sondern durch ihren Namen.

Ich vermute, es liegt am Replace-Parameter, dass ich irgendwas falsch gemacht habe...

Weiß jemand, was ich da falsch gemacht habe?

Danke schonmal im Vorau!

Gruß

Trex

Bearbeitet von Trex88
Geschrieben

Hi Trex,

dein Beispiel passt irgendwie nicht zu deinem Text..

preg_match_all() <-> preg_replace()

$bla <-> $asd

was soll da wie ersetzt werden... ? du machst doch gar kein replace?

Gruß,

Markus

Geschrieben (bearbeitet)

Du könntest preg_replace_callback() benutzen:


<?php

function _replaceVar($_arrMatch) {
$mixRes = '';
if (isset($GLOBALS[$_arrMatch[1]])) {
$mixRes = $GLOBALS[$_arrMatch[1]];
}
return $mixRes;
}


$strVarTest = 'test';
$intVarTest = 1;

$strTest = 'Das ist ein Test mit den Werten {${strVarTest}} und {${intVarTest}}.';

echo $strTest."<hr>";

$strTest = preg_replace_callback('/\{\$\{([^\}]+)\}\}/','_replaceVar',$strTest);

echo $strTest;

?>
[/PHP]

Edit:

Ich habe mir gerade mal den e-Modifier angeschaut.

Es geht auch so einfacher:

[PHP]
$strTest = preg_replace('/\{\$\{([^\}]+)\}\}/e','\$GLOBALS[\\1]',$strTest);

Ich vermute, Du müsstest in Deinem Beispiel das Dollar-Zeichen escapen und für die Back-Referenz zwei Escape-Zeichen verwenden.

Bearbeitet von Monty82
Geschrieben (bearbeitet)

Hallo,

erstmal danke für die Antworten, und sorry für meine etwas verwirrende Beschreibung.

Ich meinte $asd an Stelle von $bla und {${asd}} an Stelle von {${bla}}.

Leider lag der Fehler ganz woanders, dummerweise habe ich nur den OB - eigentlich zur besseren Übersichtlichkeit gedacht - immer automatisch leeren lassen, wenn ein Fehler auftrat.

Dadurch wurde der konkrete Fehler nicht angezeigt und ich habe ein wenig im Dunklen rumgetappt.

Trotzdem vielen Dank für eure Mühen! =)

Gruß

Trex

Bearbeitet von Trex88

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...