使用preg_replace_callback时出现问题

时间:2011-07-30 20:46:43

标签: php regex

我使用preg_replace_callback时遇到问题。我有谷歌翻译课 我想用它来翻译所有的比赛。

代码是。

$code = preg_replace_callback('/_e\(\'(.*?)\'\)/',create_function(
'$matches',
'return $translator->translate($matches);'),
$code);

当我为var $代码进行var转储时,我发现它的字符串为“1”!!!

我确定即时通讯正在为班级使用正确的方式。

感谢。

3 个答案:

答案 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
);