有没有办法在preg_replace_callback回调函数中传递另一个参数?

Str*_*rae 9 php preg-replace preg-replace-callback preg-match-all preg-match

嗯伙计们,我真的希望我的英语能很好地解释我的需要.

让我们举个例子(这只是一个例子!)代码:

class Something(){
    public function Lower($string){
        return strtolower($string);
    }
}
class Foo{
    public $something;
    public $reg;
    public $string;
    public function __construct($reg, $string, $something){
        $this->something = $something;
        $this->reg = $reg;
        $this->string = $string;
    }
    public function Replace(){
        return preg_replace_callback($this->reg, 'Foo::Bar', $this->string);
    }
    public static function Bar($matches){
        /*
        * [...]
        * do something with $matches and create the $output variable
        * [...]
        */

        /*
        * I know is really useless in this example, but i need to have an istance to an object here
        * (in this example, the Something object, but can be something else!)
        */
        return $this->something->Lower($output);
    }
}
$s = new Something();
$foo = new Foo($myregexp, $mystring, $s);
$content = $foo->Replace();
Run Code Online (Sandbox Code Playgroud)

因此,php手册说要使用类方法作为回调preg_replace_callback(),该方法必须是抽象的.

我需要Something在回调函数中传递一个prevuosly初始化对象的实例(在该示例中,该类的实例).

我尝试使用call_user_func(),但不起作用(因为这样我错过了matches参数).

有没有办法做到这一点,或者让我分开过程(做之前preg_match_all,为每个匹配检索替换值,然后一个简单preg_replace)?

编辑:作为旁注,在tom haigh回答之前,我使用了这个解决方法(在这个例子中,这是Replace方法):

$has_dynamic = preg_match_all($this->reg, $this->string, $dynamic);
if($has_dynamic){
    /*
    * The 'usefull' subset of my regexp is the third, so $dynamic[2]
    */
    foreach($dynamic[2] AS $key => $value){
        $dynamic['replaces'][$key] = $this->Bar($value);
    }
    /*
    * ..but i need to replace the complete subset, so $dynamic[0]
    */
    return str_replace($dynamic[0], $dynamic['replaces'], $this->string);
}else{
    return $this->string;
}
Run Code Online (Sandbox Code Playgroud)

希望可以帮助别人.

Tom*_*igh 13

很难将参数传递给回调,但不是这样:

return preg_replace_callback($this->reg, 'Foo::Bar', $this->string);
Run Code Online (Sandbox Code Playgroud)

你可能Bar()不是静态的,并使用这个:

return preg_replace_callback($this->reg, array($this, 'Bar'), $this->string);
Run Code Online (Sandbox Code Playgroud)

然后回调函数将能够看到 $this

请参阅伪类型和变量中的 '回调'

同样在PHP> = 5.3中,您可以使用匿名函数/闭包将其他数据传递给回调函数.


Яро*_*лин 12

我试图通过create_function()和call_user_function()方法将参数(额外参数)传递给回调时遇到困难.

这是供参考:

<?php
$pattern = "/([MmT][a-z]*)/";
$string = "Mary is a naughty girl because she took all my animals.";
$kill = "Mary";

echo preg_replace_callback($pattern, function($ma) use ($kill) {

    foreach ($ma as $m){
        if ($m == $kill){
            return "Jenny";
        }
        return "($m)";
    }
}, $string);

echo "\n";
?>
Run Code Online (Sandbox Code Playgroud)
$ php preg_replace_callback.php 
Jenny is a naughty girl because she took all (my) ani(mals).
Run Code Online (Sandbox Code Playgroud)