Предполагая> = PHP 5.3 ...
preg_replace_callback('%(\w+?)%', function($matches) use ($var1, $var2) {
return $$matches[1][0];
}, $str);
Как видите, вам нужно передать ссылку на каждую из внешних переменных в замыкание.
Возможно, вам лучше создать массив с заменяющими переменными и просто передать этот массив, а затем подписать его ...
preg_replace_callback('%(\w+?)%', function($matches) use ($vars) {
return isset($vars[$matches[1][0]]) ? $vars[$matches[1][0]] : $matches[0][0];
}, $str);
У меня сейчас нет возможности протестировать этот код, но я верю, что общий принцип - здравый смысл:)