PHP preg_replace, где замена - это произвольная функция совпадения - PullRequest
0 голосов
/ 26 марта 2010

Предположим, я хочу заменить вхождения "foo" на "oof":

$s = "abc foo bar";
echo preg_replace('/(foo)/', strrev("$1"), $s);

Вместо "abc oof bar" я получаю "abc 1$ bar". Другими словами, он передает буквенную строку «$ 1» в функцию strrev () вместо соответствия регулярному выражению «foo».

Какой лучший способ исправить эту проблему в приведенном выше коде?

1 Ответ

2 голосов
/ 26 марта 2010

Передайте флаг /e.

echo preg_replace('/(foo)/e', 'strrev("\\1")', $s);

Более безопасной альтернативой является использование preg_replace_callback.

function revMatch ($matches) {
  return strrev($matches[1]);
}
...

echo preg_replace_callback('/(foo)/', "revMatch", $s);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...