Передача дополнительных аргументов в preg_replace_callback с использованием PHP 5.2.6

Я изучал подобные вопросы, но я все еще немного неясен, если это возможно и/или лучший способ передать дополнительные аргументы в preg_replace_callback с помощью PHP 5.2.6

В этом случае я также хочу передать ключ $ из цикла foreach на функцию if_replace.

public function output() {
if (!file_exists($this->file)) {
    return "Error loading template file ($this->file).<br />";
}
$output = file_get_contents($this->file);

foreach ($this->values as $key => $value) {
    $tagToReplace = "[@$key]";
    $output = str_replace($tagToReplace, $value, $output);
    $dynamic = preg_quote($key);
    $pattern = '%\[if @'.$dynamic.'\](.*?)\[/if\]%'; // produces: %\[if @username\](.*?)\[/if\]%
    $output = preg_replace_callback($pattern, array($this, 'if_replace'), $output);
}

return $output;
}



public function if_replace($matches) {

    $matches[0] = preg_replace("%\[if @username\]%", "", $matches[0]);
    $matches[0] = preg_replace("%\[/if]%", "", $matches[0]);
    return $matches[0];
}

Удивительно, если что-то вроде этого будет работать:

class Caller {

public function if_replace($matches) {

    $matches[0] = preg_replace("%\[if @username\]%", "", $matches[0]);
    $matches[0] = preg_replace("%\[/if]%", "", $matches[0]);
    return $matches[0];
}

}

$instance = new Caller;

$output = preg_replace_callback($pattern, array($instance, 'if_replace'), $output);

Ответ 1

До PHP 5.3

Вы можете использовать вспомогательный класс:

class MyCallback {
    private $key;

    function __construct($key) {
        $this->key = $key;
    }

    public function callback($matches) {
        return sprintf('%s-%s', reset($matches), $this->key);
    }
}

$output = 'abca';
$pattern = '/a/';
$key = 'key';
$callback = new MyCallback($key);
$output = preg_replace_callback($pattern, array($callback, 'callback'), $output);
print $output; //prints: a-keybca-key

Начиная с PHP 5.3

Вы можете использовать анонимную функцию:

$output = 'abca';
$pattern = '/a/';
$key = 'key';
$output = preg_replace_callback($pattern, function ($matches) use($key) {
            return sprintf('%s-%s', reset($matches), $key);
        }, $output);
print $output; //prints: a-keybca-key

Ответ 2

$pattern = '';
$foo = 'some text';

return preg_replace_callback($pattern, function($match) use($foo)
{
var_dump($foo);

}, $content);

Ответ 3

К сожалению, вы не можете. В PHP 5.3 вы можете просто использовать закрытие, чтобы иметь доступ к переменным, которые вы передавали в качестве параметров.

В вашем случае есть два возможных решения: чистый и грязный.

Грязный хранит параметры в глобальных переменных, поэтому вы можете получить к ним доступ изнутри обратного вызова.

Чистый создает класс, в котором вы передаете параметры, например, через конструктор. Затем вы используете array($instance, 'methodName') в качестве обратного вызова и просто $this->whatever доступ к параметрам через $this->whatever вашего метода.