2012-09-13 15 views
0

這不起作用,並輸出一個空字符串:php:爲什麼preg_replace_callback不允許內置php函數,只是匿名用戶函數?

$check["pattern"] = "correct"; 
$text = "Could this be correct?"; 
echo preg_replace_callback($check["pattern"],ucfirst,$text); 

本來不錯,以使用內置的功能。實際上,通用回調允許按照http://php.net/manual/en/language.types.callable.php內置函數,但不允許preg_replace_callback。可能是PHP的功能請求?

+0

我確定你已經聽說過'strpos',但我只是把它放在那裏...... –

+0

當你把「ucfirst」放在引號中時,它也不起作用嗎? (因爲它是一個字符串...) –

+0

是的,謝謝,這只是一個虛擬的例子。我在現實生活中使用了一個合適的正則表達式:P – giorgio79

回答

3

您的代碼應該觸發的通知和警告:

  • 注意:用未定義的常量ucfirst的 - 假設 'ucfirst'
  • 警告:preg_replace_callback():分隔符不能是字母,數字或反斜線

如果不是這樣,你真的需要檢查你的PHP錯誤報告設置。固定代碼中的錯誤消息的幫助:

$check["pattern"] = "/correct/"; 
$text = "Could this be correct?"; 
echo preg_replace_callback($check["pattern"],'ucfirst',$text); 

...我們得到這樣的:

警告:ucfirst()預計參數1是字符串數組給定

因此使用內置回調函數工作正常。但是,如manual page for ucfirst()所解釋的那樣,該函數需要一個string,而不是一個數組。並且,作爲manual page for preg_replace_callback()說明:

將被調用,並通過所述受試者中的字符串匹配元素的一個陣列的回調。

綜上所述:這不是一個明智的功能要求,它在你的代碼;-)

+0

謝謝,很好的解釋。將在幾分鐘內接受它。 – giorgio79

2

一個bug它的工作原理只是所有功能罰款。問題是這些函數需要某些參數。 ucfirst需要字符串作爲輸入,但preg_replace_callback正在傳遞一組匹配。

因此......如果您有一個內置函數,它的簽名與preg_replace回調簽名兼容,它就可以工作。但不是,並非所有內置函數都具有兼容的簽名。

+0

謝謝,另一個很好的解釋。阿爾瓦羅是第一個,所以我希望如果我接受,這是可以的:) – giorgio79

相關問題