Правильное решение проблемы
function incremental_replace($subject) {
$replacer = function($matches) {
$index = 0;
return preg_replace('/\?/e', '++$index', $matches[0]);
};
return preg_replace_callback('/\[[^\]]*\]/', $replacer, $subject);
}
$subject = "Replace ? question mark in brackets [? with ? incre?mental ??]?...";
echo incremental_replace($subject);
Предыдущая форма этого ответа
Я неправильно понял вопрос и вместо этого ответил на другой похожий вопрос. Я оставляю ответ здесь, потому что кто-то может найти его полезным.
Общая идея такова:
function replacer($matches) {
$replacements = array(1, 2, 34);
$index = 0;
return preg_replace('/\?+/e', '$replacements[$index++]', $matches[0]);
}
$subject = "Replace ? question mark in brackets [? with ? incremental ??]?...";
echo preg_replace_callback('/\[[^\]]*\]/', 'replacer', $subject);
См. Базовую концепцию в действии .
Если вы используете PHP> = 5.3, вы можете сделать гораздо более обобщенное решение:
function incremental_replace($subject, $replacements) {
$replacer = function($matches) use ($replacements) {
$index = 0;
return preg_replace('/\?+/e', '$replacements[$index++]', $matches[0]);
};
return preg_replace_callback('/\[[^\]]*\]/', $replacer, $subject);
}
$subject = "Replace ? question mark in brackets [? with ? incremental ??]?...";
echo incremental_replace($subject, array(1, 2, 34));
Наконец, если вы хотите ограничить себя только одним знаком вопроса (т. Е. Если ??
внутри скобок можно изменить просто на ?
), тогда вы можете поменять preg_replace
внутри функции «replacer» с простым str_replace
, который был бы быстрее.