PHP preg_replace - поиск замены из массива с использованием совпадения в качестве ключа - PullRequest
6 голосов
/ 13 июля 2010

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

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

Таким образом, я обращаюсь к Stack Overflow за помощью. Любой берущий?

Ответы [ 4 ]

7 голосов
/ 13 июля 2010
echo preg_replace('/%([a-z_]+)%/e', '$rep["$1"]', $str);

дает:

PHP does my head in!

См. документы по модификатору 'e' .

2 голосов
/ 19 сентября 2013

Кажется, что модификатор "е" устарел. Есть проблемы с безопасностью. Кроме того, вы можете использовать preg_replace_callback.

$res = preg_replace_callback('/\%([a-z_]+)\%/', 
                             function($match) use ($rep) { return  $rep[$match[1]]; },
                             $str );
2 голосов
/ 13 июля 2010

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

$res = preg_replace('/\%([a-z_]+)\%/e', "\$rep['$1']", $str);
1 голос
/ 13 июля 2010

Просто чтобы предоставить альтернативу 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;
...