PHP Preg Заменить замещающий массив

Итак, я пытаюсь сделать что-то вроде этого:

preg_replace("/\{([a-zA-Z0-9_]+)\}/", $templateVariables[$1], $templateString);

Теперь я знаю, что это невозможно, но я хотел бы знать, есть ли способ сделать это, потому что я попытался использовать create_function, однако $ templateVariables является локальной переменной для функции, в которой он находится, поэтому Я не могу получить доступ к $ templateVariables из create_function, поэтому я застрял здесь. Я бы предпочел не искать спички, чтобы выяснить, чем их заменить, а затем найти их снова, чтобы заменить, что просто ужасно неэффективно. Так или иначе, я могу получить локальную переменную из анонимной функции, или у кого-нибудь есть хорошие предложения.

Благодарю.

3 ответа

Решение

Попробуй это:

$vars = array(
    "test" => "Merry Christmas",
);
$string = "test {test} test";
$string = preg_replace_callback("/\{([a-zA-Z0-9_]+)\}/", function($match) use ($vars) {
    return isset($vars[$match[1]]) ? $vars[$match[1]] : $match[0];
}, $string);
echo $string;

Это должно вывести:

тест с Рождеством

Вы можете увидеть рабочий пример здесь http://codepad.viper-7.com/2ZNNYZ

Вам необходимо использовать модификатор e regexp:

preg_replace("/\{([a-zA-Z0-9_]+)\}/e", "\$templateVariables['\\1']", $templateString);

На самом деле вы можете использовать preg_replace с модификатором /e:

preg_replace("/\{([a-zA-Z0-9_]+)\}/e", '$templateVariables[\'$1\']', $templateString)

Но это может быть не самый безопасный путь здесь...

Другие вопросы по тегам