Preg_replace_callback geri çağırma işlevi başka bir parametre geçmek için bir yolu var mı?

3 Cevap php

mmmh çocuklar, ben gerçekten benim ingilizce ne gerek açıklamak için iyi enaught umuyoruz.

Bu kod example (! Bu sadece bir örnektir) atın:

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

Yani, php manuel geri arama gibi bir sınıf yöntemi kullanmak için preg_replace_callback(), yöntem soyut olması gerektiğini söylüyorlar.

I need to pass an instance of a previuosly initialized object (in the example, an instance of the Something geri arama işlevi de sınıf).

I call_user_func() kullanmak için, ancak (i ​​matches parametresini özledim bu şekilde becose) çalışmaz uğraş.

Bunu yapmak için bir yolu var mı, ya da ben (, önce yaptığını preg_match_all her maç için değiştirin değerini almak ve ardından basit bir preg_replace) sürecini ayırmak? Zorunda

edit: Bir yan not olarak, Tom Haigh cevap önce, ben bu iş çevresinde kullanılan (örnekte, bu yöntemi değiştirin ise):

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

Umut birisi yardımcı olabilir.

3 Cevap

Bu geri çağrıları argüman geçmek zordur, ama bunun yerine:

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

Sen Bar() statik değil yapmak, ve bu kullanabilirsiniz:

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

Sonra geri çağırma işlevi görmek mümkün olacak $this

Içinde 'geri' bak Pseudo-types and variables

Ayrıca PHP> = 5.3 sizi anonymous functions/closures çağrı işlevleri için diğer verileri aktarmak için kullanabilirsiniz.

I got stuck while trying to pass an argument (extra parameter) to a callback with the create_function() and call_user_function() methods.

Bu başvuru için:

<?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";
?>

$ php preg_replace_callback.php 
Jenny is a naughty girl because she took all (my) ani(mals).

evet ben geri çağırma fonksiyonu kullanılabilir böylece değişen bir değişkeni ayarlamak ve unset için böyle bir şey kullanmak ve bunu yapmak için yeni php gerekmez:

foreach ($array as $key) {
    $this->_current_key = $key;
    preg_replace_callback($regex, array($this, '_callback'), $content);
    unset($this->_current_key);
}

sonra geri çağırma işlevi $ bu-> _current_key mevcuttur:

function _callback ($match) {    
    //use the key to do something
    new_array[$key] = $match[0];

    //and still remove found string
    return '';
}