I have a string which can contain multiple matches (any word surrounded by percentage marks) and an array of replacements - they key of each replacement being the match of the regex. Some code will probably explain that better...
$str = "PHP %foo% my %bar% in!";
$rep = array(
'foo' => 'does',
'bar' => 'head'
);
The desired result being:
$str = "PHP does my head in!"
I have tried the following, none of which work:
$res = preg_replace('/\%([a-z_]+)\%/', $rep[$1], $str);
$res = preg_replace('/\%([a-z_]+)\%/', $rep['$1'], $str);
$res = preg_replace('/\%([a-z_]+)\%/', $rep[\1], $str);
$res = preg_replace('/\%([a-z_]+)\%/', $rep['\1'], $str);
Thus I turn to Stack Overflow for help. Any takers?
echo preg_replace('/%([a-z_]+)%/e', '$rep["$1"]', $str);
gives:
PHP does my head in!
See the docs for the modifier 'e'.
It seems that the modifier "e" is deprecated. There are security issues. Alternatively, you can use the preg_replace_callback.
$res = preg_replace_callback('/\%([a-z_]+)\%/',
function($match) use ($rep) { return $rep[$match[1]]; },
$str );
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With