Вы можете использовать preg_replace
с модификатором e
как:
$string = preg_replace('/{([a-zA-Z\_\-]*?)}/ie','$arr["$1"]',$string);
Ideone Link
Использование e
модификатор, вы можете иметь любое PHP выражение в замещающей части preg_replace
.
Теперь, почему ваше регулярное выражение /{([a-zA-Z\_\-])*?}/i
не работает?
Вы положили*?
за скобками захвата ( )
в результате вы захватываете только первый символ слова, найденного в { }
.
Также обратите внимание, что вы не избежали {
и }
, которыеявляются метасимволом регулярного выражения, используемым для определения квантификатора диапазона {num}
, {min,max}
.Но в вашем случае не нужно , чтобы избежать их, потому что механизм регулярных выражений может сделать вывод из контекста, что {
и }
не могут использоваться в качестве оператора диапазона, поскольку они не имеют чисел в требуемом форматеих и, следовательно, относится к ним буквально.