2010-03-31 52 views
2

之前,这就是我想要做的:的preg_replace通比赛中换人

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

所以结果应该是翻译(“测试”)被替换为“测试”的翻译。

问题是translate(“$ 2”)将字符串“$ 2”传递给translate函数。所以translate()试图翻译“$ 2”而不是“test”。

在替换之前是否有某种方法将匹配的值传递给函数?

回答

6

preg_replace_callback是你的朋友

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

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

+1好多了:) – codaddict 2010-03-31 14:57:21

0

可以使用preg_replace_callback函数为:

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

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