mmmh les gars, j'espère vraiment que mon anglais est bien en train d'expliquer ce dont j'ai besoin.Existe-t-il un moyen de transmettre un autre paramètre dans la fonction de rappel preg_replace_callback?
permet de prendre ce exemple (qui est juste un exemple!) De 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();
Ainsi, le manuel php dire que d'utiliser une méthode de classe comme rappel dans preg_replace_callback()
, la méthode doit être abstraite .
Je dois passer une instance d'un objet initialisé précédemment (dans l'exemple, une instance de la classe Something
) à la fonction de rappel.
J'ai essayé d'utiliser call_user_func()
, mais ne fonctionne pas (car de cette façon, le paramètre matches
me manque).
Y at-il un moyen de le faire, ou dois-je séparer le processus (faire avant preg_match_all
, pour chaque match récupérer la valeur de remplacement, puis un simple preg_replace
)?
modifier: comme un côté note, avant la tom Haigh réponse, je l'ai utilisé ce travail autour (dans l'exemple, c'est la méthode Remplacer):
$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;
}
L'espoir peut aider quelqu'un.
Cela fonctionne! Je pensais que la méthode de classe devait être statique, ne me souviens pas où je l'ai lu ..Peut-être que je n'ai pas du tout et je me salis avec quelques phrases. Merci – Strae