Вот одна версия.
$replacements = array('puppy', 'cute', 'ridiculously', '1300');
$input = 'This $0 is $2 $1. Still, \$3 is a lot to pay for a puppy.';
$output = preg_replace_callback('/(?<!\\\\)\$(\d+)/', 'replace_input', $input);
echo $input . "<br>";
echo $output;
function replace_input($matches) {
global $replacements;
$index = $matches[1];
return $index < 0 || $index >= count($replacements) ? $matches[0] : $replacements[$index];
}
Выход:
This $0 is $2 $1. Still, \$3 is a lot to pay for a puppy.
This puppy is ridiculously cute. Still, \$3 is a lot to pay for a puppy.
Он обрабатывает обратную косую черту перед $, чтобы экранировать эту переменную. Это может быть неудобным синтаксисом, потому что тогда вам нужно избегать обратной косой черты, что еще больше усложняет его (и в этом случае не обрабатывается). Регулярное выражение в основном означает $, за которым следуют одна или несколько цифр, если $ не предшествует обратная косая черта (с использованием негативного взгляда сзади ).
Он использует глобальный массив замен. Есть две альтернативы этому:
- Использовать замыкание (требуется PHP 5.3+); или
- Использование
create_function()
.
Но я думаю, что глобальное проще и "глобально", если у вас нет веских причин делать что-то другое, несмотря на обычное отвращение к таким вещам.