PHP preg_replace - нахождение замены от массива с помощью соответствия в качестве ключа

У меня есть строка, которая может содержать несколько соответствий (любое слово, окруженное метками процента) и массив замен - они вводят каждой замены, являющейся соответствием regex. Некоторый код, вероятно, объяснит это лучше...

$str = "PHP %foo% my %bar% in!";
$rep = array(
  'foo' => 'does',
  'bar' => 'head'
);

Желаемое результат быть:

$str = "PHP does my head in!"

Я попробовал следующие, ни одно из которых не работает:

$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);

Таким образом я обращаюсь к Переполнению стека для справки. Какие-либо берущие?

6
задан aaronrussell 13 July 2010 в 12:45
поделиться

3 ответа

echo preg_replace('/%([a-z_]+)%/e', '$rep["$1"]', $str);

gives:

PHP does my head in!

See the docs for the modifier 'e'

7
ответ дан 8 December 2019 в 18:32
поделиться

Вы можете использовать модификатор eval...

$res = preg_replace('/\%([a-z_]+)\%/e', "\$rep['$1']", $str);
2
ответ дан 8 December 2019 в 18:32
поделиться

Просто чтобы обеспечить альтернативу preg_replace():

$str = "PHP %foo% my %bar% in!";
$rep = array(
  'foo' => 'does',
  'bar' => 'head'
);


function maskit($val) {
    return '%'.$val.'%';
}

$result = str_replace(array_map('maskit',array_keys($rep)),array_values($rep),$str);
echo $result;
1
ответ дан 8 December 2019 в 18:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: