Поскольку PHP — это однопоточный язык процедурных сценариев1, он не работает так, как вам хотелось бы.
Невозможно запустить функцию только при вызове echo
2, вместо этого вам нужна дополнительная переменная.
$newVariable = preg_replace_callback("#\[%(.{1,20})%\]#", function($matches) {
// Do your thang here
}, $maintext);
// $maintext remains the same as it was when you started, do stuff with it here
// When you come to output the data, do...
echo $newVariable;
Существуют и другие подходы к этой проблеме, такие как обертывание приведенного выше кода в функцию, которую можно вызывать по запросу, и использование обратного вызова буферизации вывода (см. сноску № 2), но, читая между строк, я думаю, что все это было бы излишним для того, что является относительно простой проблемой.
Для записи, я думаю, что ваше регулярное выражение будет лучше, если вы сузите разрешенный контент, оно потенциально будет соответствовать символам, которые вам не нужны. Подозреваю, что так будет лучше:
#\[%(\w{1,20})%\]#
Это позволит использовать только символы a-zA-Z0-9_
в качестве заполнителя.
1 Другие могут сказать вам, что PHP теперь является объектно-ориентированным языком, но они ошибаются. Он по-прежнему в основном работает так же, и это все еще язык сценариев, но теперь он предоставляет множество объектно-ориентированных функций.
2 Можно сделать что-то очень близкое к этому , но это очень редко бывает хорошей идеей, и она слишком сложна для решения этой проблемы.
ИЗМЕНИТЬ
Важно отметить, что при использовании любого метода для передачи замен через обратный вызов (модификатор e
или preg_replace_callback()
) функция обратного вызова должна возвращать новую строку, а не выводить ее напрямую.
Это связано с тем, что код в любом операторе выполняется изнутри наружу, а «внутренний» оператор echo
(в функции обратного вызова) будет выполняться перед «внешним» оператором echo
(в строке, где вызывается preg_replace()
, поэтому порядок в котором вещи выводятся, будет неправильным.
Например:
$str = "This is my string which contains a %placeholder%";
echo preg_replace_callback('/%(\w+)%/', function($matches) {
echo "replacement string";
}, $str);
// Wrong - outputs "replacement stringThis is my string which contains a "
echo preg_replace_callback('/%(\w+)%/', function($matches) {
return "replacement string";
}, $str);
// Right - outputs "This is my string which contains a replacement string"
person
DaveRandom
schedule
18.07.2012
/e
, а вместо этого использоватьpreg_replace_callback
. - person ThiefMaster   schedule 18.07.2012/e
. Это считается очень плохой практикой и будет официально объявлено устаревшим в следующей версии PHP. - person SDC   schedule 18.07.2012