使用PHP 5.2.6将其他参数传递给preg_replace_callback

时间:2012-03-03 23:26:19

标签: php

我一直在研究类似的问题,但我仍然有点不清楚是否有可能和/或使用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);

3 个答案:

答案 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访问参数。