preg_replace在替换之前通过函数传递匹配

时间:2010-03-31 14:49:24

标签: php regex preg-replace

这就是我想要做的事情:

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

所以结果应该是翻译(“test”)被“test”的翻译所取代。

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

有没有办法在替换之前将匹配值传递给函数?

2 个答案:

答案 0 :(得分:6)

preg_replace_callback是你的朋友

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

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

答案 1 :(得分: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];    
}