mmmh Leute, ich hoffe wirklich mein Englisch ist gut erugt zu erklären, was ich brauche.Gibt es eine Möglichkeit, einen anderen Parameter in der Callback-Funktion preg_replace_callback zu übergeben?
Lets nehmen dieses Beispiel (das ist nur ein Beispiel!) Code:
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();
Also, das PHP-Handbuch sagt, dass eine Klassenmethode als Callback zu verwenden, in preg_replace_callback()
, muss die Methode abstrakt sein .
Ich muss eine Instanz eines zuvor initialisierten Objekts (im Beispiel eine Instanz der Klasse Something
) an die Callback-Funktion übergeben.
Ich habe versucht, call_user_func()
zu verwenden, aber funktioniert nicht (auf diese Weise vermisse ich den matches
Parameter).
Gibt es eine Möglichkeit, dies zu tun, oder muss ich den Prozess trennen (tun, bevor preg_match_all
, für jedes Spiel den Ersetzungswert abrufen, und dann eine einfache preg_replace
)?
edit: als Nebennote, vor der tom Haigh Antwort, habe ich diese Behelfslösung (im Beispiel, das die Methode ersetzen ist):
$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;
}
Hoffnung jemand helfen kann.
Das funktioniert! Ich dachte, dass die Klassenmethode statisch sein muss, erinnere dich nicht, wo ich es gelesen habe.vielleicht habe ich überhaupt nicht und ich bin mit einigen sätzen unordentlich. Danke – Strae