2009-09-21 8 views
0

J'ai un code comme celui-ci (ce qui est un exemple simplifié):Spécification d'une fonction de rappel dans preg_replace_callback?

function callback_func($matches) { 
    return $matches[0] . "some other stuff"; 
} 

function other_func($text) { 
    $out = "<li>"; 
    preg_replace_callback("/_[a-zA-Z]*/","callback_func",$desc); 
    $out .= $desc ."</li> \r\n"; 
    return $out; 
} 

echo other_func("This is a _test"); 

La sortie de ce devrait être

<li>This is a _testsome other stuff</li> 

mais je reçois juste

<li>This is a _test</li> 

Que suis-je faire mal/quelle incantation bizarre est nécessaire pour apaiser les dieux php?

Répondre

5

preg_replace_callback ne modifie pas la chaîne en place, mais renvoie à la place une copie modifiée de celle-ci. Essayez l'outil suivant:

function other_func($text) { 
    $out = "<li>"; 
    $out .= preg_replace_callback("/_[a-zA-Z]*/","callback_func",$desc); 
    $out .= "</li> \r\n"; 
    return $out; 
} 
+0

Oups, devrait avoir rafraîchi. Je l'ai deviné juste après. Merci quand même. –

0

Le problème est que vous n'ajoutez jamais la sortie de la fonction dans la variable $ out. Ainsi, dans callback_func(), vous devez utiliser:

$out .= $matches[0] . "some other stuff"; 

Ensuite, il ajoutera le résultat dans la chaîne pour vous à la sortie. Comme c'est le cas, vous revenez juste une valeur et ne faites rien avec elle.

+0

Vous mélangez champs. '$ out' est dans' other_func' mais '$ matches' est dans' callback_func'. –

0

Vous l'avez compris. preg_replace_callback ne modifie pas le sujet d'origine, ce que je suppose qu'il a fait. Je devais changer

preg_replace_callback("/_[a-zA-Z]*/","callback_func",$desc); 

à

$desc = preg_replace_callback("/_[a-zA-Z]*/","callback_func",$desc); 
Questions connexes