2013-07-11 22 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

相關問題