Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Empfohlene Antworten

Veröffentlicht

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

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

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

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.