我使用preg_replace_callback时遇到问题。我有谷歌翻译课 我想用它来翻译所有的比赛。
代码是。
$code = preg_replace_callback('/_e\(\'(.*?)\'\)/',create_function(
'$matches',
'return $translator->translate($matches);'),
$code);
当我为var $代码进行var转储时,我发现它的字符串为“1”!!!
我确定即时通讯正在为班级使用正确的方式。
感谢。
答案 0 :(得分:2)
这里的问题是范围。类似的东西可以在JavaScript中使用,但JS和PHP处理范围的方式不同。要从匿名函数的范围内访问$translator
,您需要将其声明为全局。
<?php
$code = preg_replace_callback('/_e\(\'(.*?)\'\)/',
create_function('$matches',
'global $translator;'.
'return $translator->translate($matches);'),
$code);
?>
如果你想将anon保持为单行,你可以使用全局数组:
<?php
$code = preg_replace_callback('/_e\(\'(.*?)\'\)/',
create_function('$matches',
"return $GLOBALS['translator']->translate($matches);"),
$code);
?>
如果你有PHP 5.3.0或更高版本,关闭和use
可以缓解这个问题:
<?php
$code = preg_replace_callback('/_e\(\'(.*?)\'\)/',
function($matches) use ($translator) {
return $translator->translate($matches);
}, $code);
?>
这假设$translator
与$code
在同一范围内创建。
答案 1 :(得分:1)
尝试将$ translator作为参数传递。
这可能看起来像:
$code = preg_replace_callback('/_e\(\'(.*?)\'\)/',create_function(
'$translator,$matches',
'return $translator->translate($matches);'),
$code);
更新:此代码示例不起作用。仅使用一个参数调用replace回调,而此处的匿名函数需要2个参数。工作实施将是:
$code = preg_replace_callback('/_e\(\'(.*?)\'\)/',create_function(
'$matches',
'global $translator; return $translator->translate($matches);'),
$code);
答案 2 :(得分:1)
在PHP 5.3中,您可以使用Closure。
<?php
$code = preg_replace_callback(
'/_e\(\'(.*?)\'\)/',
function($matches) use ($translator) {
return $translator->translate($matches);
},
$code
);