Das haben wir schon:
PHP-Code:
$x = array(
1 => '2010-02-17',
2 => 'schoen',
);
$pattern = '%(.+?)%';
$subject = 'Heute haben wir den <strong>%1%</strong>, das ist %2%. %3%';
// Notice: Undefined index: 3
echo preg_replace('/'.$pattern.'/e', '$x[\'\\1\']', $subject);
Um die Notice zu vermeiden, habe ich dir preg_replace_callback() empfohlen. Diese Funktion übergibt dem Callback aber immer nur einen einzigen Parameter. Das kannst du nicht ändern.
Wenn $x wie in diesem Beispiel global ist, kannst du es in den Callback importieren.
PHP-Code:
echo preg_replace_callback('/'.$pattern.'/', create_function('$matches', '
global $x;
return isset($x[$matches[1]]) ? $x[$matches[1]] : \'\';
'), $subject);
Das ist allerdings ziemlich unsauber. Es wäre besser, wenn x ein Property einer Klasse ist und der Callback eine Methode dieser Klasse – oder wenn du es mit Currying löst. In PHP 5.3 könnte man auch ein Closure verwenden.
Ist aber alles ziemlich kompliziert und in deinem Fall auch nicht nötig, denn es gibt einen einfacheren Weg: Bleib bei preg_replace() und nutze die Tatsache, dass bei Verwendung des e-Modifier der zweite Parameter als PHP-Code evaluiert wird.
PHP-Code:
echo preg_replace('/'.$pattern.'/e', 'isset($x[\'\\1\']) ? $x[\'\\1\'] : \'\'', $subject);