2010-03-31 5 views
2

C'est ce que je veux faire:preg_replace passe par correspondance avant de remplacer la fonction

$line = 'blabla translate("test") blabla'; 
$line = preg_replace("/(.*?)translate\((.*?)\)(.*?)/","$1".translate("$2")."$3",$line); 

Ainsi, le résultat devrait être que traduire (« test ») est remplacé par la traduction de « test ».

Le problème est que translate ("$ 2") passe la chaîne "$ 2" à la fonction translate. Donc translate() essaie de traduire "$ 2" au lieu de "test".

Existe-t-il un moyen de transmettre la valeur de la correspondance à une fonction avant de la remplacer?

Répondre

6

preg_replace_callback est votre ami

function translate($m) { 
    $x = process $m[1]; 
    return $x; 
    } 

    $line = preg_replace_callback("/translate\((.*?)\)/", 'translate', $line); 
+0

+1 beaucoup mieux :) – codaddict

0

Vous pouvez utiliser la fonction preg_replace_callback comme:

$line = 'blabla translate("test") blabla'; 
$line = preg_replace_callback("/(.*?)translate\((.*?)\)(.*?)/",fun,$line); 

function fun($matches) {  
return $matches[1].translate($matches[2]).$matches[3];  
} 
Questions connexes