2013-07-11 18 views
0

我尝试下面的代码:有什么语法获得create_function函数作为回调的工作:

$for_callback=create_function('$match','return $GLOBALS[\'replacements\'][$match[1]];'); 
$result = preg_replace_callback($regex, '$for_callback', $string); 

变量$GLOBALS['replacements']是动态生成在调用此函数之前。

我得到一个错误消息像

Warning: preg_replace_callback() [function.preg-replace-callback]: Requires argument 2, '$for_callback', to be a valid callback in...

创建的函数和回调都是新的我。这是由nickb在My question about preg_replace转给preg_replace_callback给我的一些代码增长出来的。

我想要做的是将该答案中的代码封装到一个函数中,并且遇到了范围错误,从而避免重新定义函数。 (升级到PHP 5.3+是我目前的远程可选项)。

我如何得到这个工作?

+0

''$ match''应该只是'$ match',或者如果你的货是邪教编程心情,''$匹配“'。同样的其他引用变量。 –

+0

我认为看起来很奇怪,但是这里是一个来自php.net的剪辑:$ newfunc = create_function('$ a,$ b','return'ln($ a)+ ln($ b)=“.log($ a * $ b);');.它看起来像PHP代码。实际的错误不在我的'create_fuction()'中,而是在我的'preg_replace_callback()'中,在那里我留下了他们不属于的函数变量的单引号。 – TecBrat

回答

1

首先,变量不能用单引号括起来,因为它们不会被实际值替换。

第二,您应该使用匿名函数(即闭包),因为它们更容易。像这个例子一样使用它们:

$for_callback = function($match) { 
    return $GLOBALS['replacements'][$match[1]]; 
}; 
$result = preg_replace_callback($regex, $for_callback, $string); 

编辑:闭包在PHP 5.3中可用。所以,如果你还在使用PHP < 5.3你应该(真的更新或)使用以下命令:

$for_callback=create_function('$match','return $GLOBALS[\'replacements\'][$match[1]];'); 
$result = preg_replace_callback($regex, $for_callback, $string); 
+0

我的PHP版本不支持闭包,但显然确实支持'create_function()' – TecBrat

+0

只是在我的答案中反映出来。但是,你应该*真的,真的*更新你的PHP版本。 – str

+0

你有没有在森林中找到你要找的树的时刻之一?我误解了你的答案,并没有看到你纠正了我的','$ for_callback','。这些引号是从我尝试命名函数的地方遗留下来的。 – TecBrat

相关问题