Существует ли способ передать другой параметр в preg_replace_callback функции обратного вызова?

парни mmmh, я действительно надеюсь, что мой английский язык является хорошим enaught для объяснения, в чем я нуждаюсь.

Позволяет берут этот пример (который является просто примером!) кода:

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();

Так, php руководство говорят что использовать метод класса в качестве обратного вызова в preg_replace_callback(), метод должен быть абстрактным.

Я должен передать экземпляр previuosly инициализированный объект (в примере, экземпляре Something класс) в функции обратного вызова.

Я пытался использовать call_user_func(), но не работает (becose таким образом, я отсутствую matches параметр).

Есть ли способ сделать это или иметь меня для разделения процесса (выполнение прежде preg_match_all, поскольку каждое соответствие получает значение замены и затем простое preg_replace)?

править: как заметка на полях, перед tom haigh ответ, я использовал это обходное решение (в примере, это - метод Замены):

$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;
}

Надежда может помочь кому-то.

9
задан Strae 21 April 2010 в 09:17
поделиться

1 ответ

Трудно передавать аргументы в функции обратного вызова, но вместо этого из этого:

return preg_replace_callback($this->reg, 'Foo::Bar', $this->string);

Вы можете сделать Bar () не статическим и использовать это:

return preg_replace_callback($this->reg, array($this, 'Bar'), $this->string);

Тогда функция обратного вызова сможет увидеть $ this

См. «обратный вызов» в Псевдотипы и переменные

Также в PHP> = 5.3 вы можете использовать анонимные функции / замыкания для передачи других данных в функции обратного вызова.

13
ответ дан 4 December 2019 в 08:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: