preg_replace array[$1]

Mark

Cinema4D
Hallo Ihr Lieben!

Als - ehemaliger ? ;) - Perl-User verzweifel ich gerade an einer Kleinigkeit:
Habe ein preg_replace und möchte "das Gefundene" als Schlüssel eines Array verwenden, aber PHP weigert sich konsequent ;)
Also, stark reduziert:
PHP:
$foo = preg_replace('/\[FOO (\w+?)\]/', $test[$1], $foo);
...habe $test[$1] in alle möglichen " und ' gesetzt und auch \1 und \\1 probiert ... alles ohne Erfolg :(

Bitte helft mir! :)
Im voraus lieben Dank für jeden Hinweis,
Liebe Grüße,
Mark.
 
Musst den Modifier e benutzen. Folgendes funktioniert bei mir.
PHP:
<?php
$test['bar'] = 'Hallo';
$foo = '[FOO bar]';
$foo = preg_replace('/\[FOO (\w+?)\]/e', '$test[\1]', $foo);
echo $foo;
?>
 
Wenn nur tatsächlich vorhandene Werte ersetzt werden sollen, ist es besser den regulären Ausdruck auf Basis dieser Werte zusammenzubauen:
PHP:
'/\[FOO (' . implode('|', array_map('preg_quote', array_keys($test))) . ')\]/e'
 
Hi!

Ich danke Euch beiden für die Hilfe! :)
@mAu: was so ein kleines "e" alles bewirken kann! ;) :)
@Gumbo: wichtiger Hinweis, Danke! :)

Leider war oben gezeigte preg_replace nur die halbe Wahrheit: ich möchte eigene Tags in einem Text ersetzten. So z.B. "[LINK 13]" durch "<a href='index.php?page=$links[$1]'>" bzw. ist $links hinzu noch ein zweidimensionales Array. Gesucht ist also eine Lösung für:
PHP:
$text = preg_replace('/\[LINK (\w+?)\]/', "<a href='index.php?page=$links[$1]['link']'>$links[$1]['name']</a>", $text);
...der e-Modifikator meckert da leider wieder ganz schnell ;)
Gumbos Hinweis ist insofern sehr relevant, daß natürlich nicht im Array existiernde Werte auch keinen Link erzeugen sollen (könnte man da auch gleich in einem preg_replace diese Entscheidung treffen? ... ansonsten würde ein zweiter preg_replace einfach all nicht konvertierten [LINK n] durch "" ersetzen).

Oder geht man in php an die Sache ganz anders heran? Wie geschrieben, komme von Perl und da macht man ja eigentlich alles über die Regular Expressions ;)

Habe im Chat von enne noch eine schöne Lösung über preg_replace_callback erhalten, in der der Link halt in einer funktion zusammengebastelt wird ... ist das die einzige Lösung? ...oder gibt es eine ohne zusätzliche function? :)

Liebe Grüße und nochmals vielen Dank für Eure Hilfe! :)
Mark.

//edit: habe gerade create_function() auf http://at2.php.net/preg_replace_callback entdeckt ... das scheint ja bereits die Lösung zu sein :) ...elegantere Alternativen natürlich gerne gesehen ;)
 
Beim „e“-Modifikator ist es wichtig als Ersatz einen gültigen, auswertbaren PHP-Ausdruck zu schreiben. Das sieht jetzt sicherlich kompliziert aus:
PHP:
preg_replace('/\[LINK (' . implode('|', array_map('preg_quote', array_keys($links))) . ')\]/e', '"<a href=\"index.php?page=".$links[$1][\'link\']."\">".$links[$1][\'name\']."</a>"', $text)
Das Ganze könnte auch über den Umweg einer eigenen Funktion laufen.
 
Hi Gumbo,
Beim „e“-Modifikator ist es wichtig als Ersatz einen gültigen, auswertbaren PHP-Ausdruck zu schreiben. Das sieht jetzt sicherlich kompliziert aus
...das sieht überhaupt nicht kompliziert aus: das ist WUNDERSCHÖN! :eek:
Habe einfach nicht rausbekommen, welches ', " und \" Php wann, wo und weshalb gerne hätte und Deine Lösung ist pipifein! :)
Auch mittels preg_replace_callback und create_function scheiterte ich mit den Variablen: wusste auch dort nicht, wie ich alles in den ' der "function" unterbringen muß, damit Php diese interpretiert :(
Aber das Leid hat ein Ende und ich Danke Dir ganz ganz herzlich! :)

Liebe Grüße,
Mark.
 
Zurück