echo $begrüßung;
$text = preg_replace('#[lang=(.*)]#Uis', $lang['\1'], $text);
Ich habe schon mir alle erdenklichen Möglichkeiten ausprobiert von '$lang[\1]', "$lang[\1]" bis "$lang['\1'] etc..
$lang['\1']: Backreferences werden nur in Strings ausgewertet. Ein Ausdruck als Parameter wird erst ausgewertet und dann übergeben. Du willst aber einen Ausdruck übergeben, ohne dass er vorher ausgewertet wird. So etwas ist nicht vorgesehen. PHP versucht also einen Index \1 im Array $lang zu finden, es gibt aber nur house und garden. <gebetsmühle>Das würde dir mit einer Notice angezeigt werden, wenn du das error_reporting auf E_ALL stehen hättest.</gebetsmühle>
"$lang[\1]" und "$lang['\1']": Wird aufgrund der "" von PHP ausgewertet bevor es übergeben wird. Entspricht in der Wirkung wie $lang['\1'].
'$lang[\1]' ist ein String. preg_replace() müsste den evaluieren, was den Modifizierer e erfordert. Siehe Handbuch zu preg_replace().
eval() ist mit allergrößter Umsicht zu verwenden, dass nichts ausgeführt wird, was nicht vorgesehen ist. Das gilt auch hier. Wenn du also Benutzereingaben mit diesem Muster verarbeitest, überlege dir, wie man Code einschleusen kann und wie man das verhindert. Recherchen zu preg_replace und eval können dabei helfen.
Und wie ChrisB schon ausführte gibt es preg_replace_callback(), womit man sich das eval und den Ärger damit sparen kann.
echo "$verabschiedung $name";