2010-11-14 48 views
0

我有小問題。我試圖通過用ucword替換所有大寫字詞

Hello World What 

替換句話即

HELLO World WHAT 

到目前爲止有辦法檢測它:

preg_replace('/(\b[A-Z][A-Z]+\b)/sm','$1', $string); 

但不起任何作用,因爲我不能把作爲一個參數ucwords('$ 1')。

任何幫助將是偉大的。

歡呼聲, /馬辛

附: 這種方法並不好:ucwords(strtolower($ string));因爲我想要保留所有並非全部上限的東西。

回答

2

它會更有效使用匿名函數,而再上/e修改來電。

$formatted = preg_replace_callback(
     '/(\b[A-Z][A-Z]+\b)/', 
     create_function(
      '$matches', 
      'return ucwords(strtolower($matches[0]));' 
     ), 
     $string 
    ); 
+0

效率更高? – Marcin 2010-11-14 11:54:36

+0

替換字符串本質上被傳遞到PHP的每個替換,而不是回調方法,它只需要傳遞一次。 – 2010-11-14 11:57:08

+0

不錯,我發佈了其他的正則表達式問題,你能幫助嗎:http://stackoverflow.com/questions/4177374/detecting-and-replacing-merged-words-myword-to-my-word-php-regex - 歡呼聲 – Marcin 2010-11-14 12:03:51

2

如何使用:

ucwords(strtolower($string)); 

您可以用e修改這種方法結合起來:

preg_replace('/(\b[A-Z][A-Z]+\b)/sme','ucwords(strtolower($1))', $string); 
+0

這是沒有辦法的辦法作爲財產以後什麼不是全部大寫應該保持原樣,但修改爲使用正則表達式感謝 – Marcin 2010-11-14 11:40:35

+0

- 現在應該僅在全部大寫工作。 – 2010-11-14 11:44:53

+0

但是,您沒有在該行代碼中使用'/ e'修飾符? – 2010-11-14 11:45:13