Передача дополнительных аргументов в 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
вашего метода.