我一直在研究类似的问题,但我仍然有点不清楚是否有可能和/或使用PHP 5.2.6在preg_replace_callback中传递额外参数的最佳方法
在这种情况下,我也希望将$ key从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);
答案 0 :(得分:32)
在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
答案 1 :(得分:17)
$pattern = '';
$foo = 'some text';
return preg_replace_callback($pattern, function($match) use($foo)
{
var_dump($foo);
}, $content);
答案 2 :(得分:2)
不幸的是你做不到。在PHP 5.3中,您可以简单地使用闭包来访问您作为参数传递的变量。
在您的情况下,有两种可能的解决方案:干净且肮脏。
脏的将params存储在全局变量中,以便您可以从回调内部访问它们。
干净的人正在创建一个传递参数的类,例如:通过构造函数。然后,您使用array($instance, 'methodName')
作为回调,只需通过方法中的$this->whatever
访问参数。