2011-08-18 37 views
2

我想使用NameCase在code.google.com上的php類。當我運行它時,我收到了這個通知,我不明白爲什麼。PHP的preg_replace反向引用導致未定義的常量通知

PHP公告:未定義的常量的MC使用 - 假定 '了Mc' 在 namecase.php(54):1號線

53 if(preg_match('/\bMac[A-Za-z]{2,}[^aciozj]\b/', $str) || preg_match('/\bMc/', $str)) { 
54  $str = preg_replace("/\b(Ma?c)([A-Za-z]+)/e", "$1.ucfirst('\\2')", $str); 
55  // Now correct for "Mac" exceptions 
56  $str = preg_replace('/\bMacEvicius/','Macevicius', $str); // Lithuanian 
57  $str = preg_replace('/\bMacHado/', 'Machado', $str); // Portuguese 
58  $str = preg_replace('/\bMacHar/', 'Machar', $str); 
59  ... 

正則表達式的代碼有沒有什麼可以做更正代碼,使其不會產生通知。

感謝

回答

7

您需要引用$ 1的替換,例如"'$1'.ucfirst('\\2')"或更好,請使用preg_replace_callback。在PHP 5.3+中,你可以通過一個閉包,例如:

$str = preg_replace_callback(
    "/\b(Ma?c)([A-Za-z]+)/", 
    function($m) { return $m[1] . ucfirst($m[2]); }, 
    $str 
); 
+0

而在5.3之前,你已經可以通過'create_function()'來傳遞閉包了。可能不像5.3+封閉那樣整潔和「乾淨」,但仍然如此。 –

+0

測試了兩種解決方案並且工作完美!感謝您的快速回復。 – Brandon

+0

更正:當然我的意思是匿名函數,而不是閉包。 –

相關問題