Честно говоря, без говнокода не представляю как сделать подобное.
Если уж очень топорный вариант. Первое что приходит в голову - либо класс передавать, либо глобал использовать. Глобальные переменные это как-то уж очень через чур, а вот с классом другое дело (выглядит почище, да и для глаз приятнее).
Навскидку, код, который будет отвечать за вывод будет следующим:
/* @var string Текст, в котором проводим замену*/
$str = <<<STRTEXT
[index:Звездочет]А тут хз что[/index]
Тут текст [guest]Иванов[/guest]
STRTEXT;
$oTextParser= (new TextParser($str))
->addRule("#\\[index:(.+?)\\](.*?)\\[/index\\]#ies", "indexShow('\\1', '\\2')")
->addRule("#\\[guest](.*?)\\[/guest]#ies","checkGuest('\\1')")
->parse();
/*
На выходе хочу получить:
-------------------------
Звездочет(А тут хз что)
Тут текст GUEST(Иванов)
*/
echo "<pre>";
var_dump($oTextParser->getText());
echo "</pre>";
Код функций который я буду использовать:
function indexShow( $a, $b)
{
return $a."(".$b.")";
}
function checkGuest( $a )
{
return 'GUEST('.$a.')';
}
Сама реализация:
class TextParser
{
/* @var string Результат выполнения парсинга */
public $parsed;
/* @var string[] Ассоциативный список правил в формате: регулярка => функция для замены */
public $rules = [];
public function __construct( $text )
{
$this->parsed = $text;
}
/**
* Добавляет правило работы парсера
* Для использования цепочек возвращает текущий экземпляр
*
* @param string $regex
* @param string|callback $func
* @return TextParser
*/
public function addRule( $regex, $func )
{
$this->rules[ $regex ] = $func;
return $this;
}
/**
* Выполняет разброр исходного текста
* Для использования цепочек возвращает текущий экземпляр
*
* @return TextParser
*/
public function parse()
{
array_walk(
$this->rules,
function($function, $regular)
{
$this->parsed = preg_replace($regular, $function, $this->parsed);
}
);
return $this;
}
/**
* Возвращает результат парсера (или исходный текст, если был вызван до метода parse)
*
* @return string
*/
public function getText()
{
return $this->parsed;
}
}
Естественно, решение имеет свои изъяны и слабые стороны, помимо плохого кода, нельзя будет использовать функции в текущем окружении ($this).