preg_replace передает соответствие через функцию перед заменой - PullRequest
2 голосов
/ 31 марта 2010

Вот что я хочу сделать:

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

Таким образом, результатом должно быть то, что перевод («тест») заменяется переводом «тест».

Проблема в том, что translate ("$ 2") передает строку "$ 2" в функцию translate. Поэтому translate () пытается перевести «$ 2» вместо «test».

Есть ли способ передать значение соответствия в функцию перед заменой?

Ответы [ 2 ]

6 голосов
/ 31 марта 2010

preg_replace_callback - ваш друг

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

  $line = preg_replace_callback("/translate\((.*?)\)/", 'translate', $line);
0 голосов
/ 31 марта 2010

Вы можете использовать функцию 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];    
}
...