Я бы собрал парсер, который разбивает код на его токены (переменные и простой текст). Для простоты вы можете использовать функцию pre_split
, чтобы сделать это:
$tokens = preg_split('/(\{[^\}]+\})/', $string, -1, PREG_SPLIT_DELIM_CAPTURE);
Теперь вы можете перебирать токены и проверять, является ли это переменная или простой текст:
foreach ($tokens as $token) {
if ($token[0] === '{' && $token[strlen($token)-1] === '}') {
// token is a variable
} else {
// token is plain text
}
}
Преимущество этого подхода состоит в том, что переменные не заменяются в тексте, который уже был заменен. Итак:
$foo = '{bar}';
$bar = 'bar';
$template = 'Lorem {foo} {bar} sit amet …';
Здесь текст будет заменен на Lorem bar {bar} sit amet …
, а не Lorem bar bar sit amet …
, как это произошло бы с вашим кодом, когда {bar}
заменяется после {foo}
.