2012-08-08 132 views
1

我正在爲使用Codeigniter構建的自定義CMS編碼標記系統,並試圖執行特定格式。首字母大寫除文章,連詞和介詞外每個單詞的首字母

基本上,我需要每個單詞的第一個字母與下面的例外予以資本化,這應該是小寫:

  • 文章:一,一個在
  • 協調連接詞:和,但是,或者,對於,也不等
  • 介詞(少於五個字母):與上,在以從由等

此外,如果標籤與一個開始以上,應該是ca pitalized。

正確格式化標籤的一些例子:

  • 權力的遊戲
  • 的小人和男子
  • 從第一個到最後一個環的
  • 極品飛車:

到目前爲止我只有:

$tag = 'Lord of the Rings'; 
$tag = ucwords($tag); 

$patterns = array('/A/', '/An/', '/The/', '/And/', '/Of/', '/But/', '/Or/', '/For/', '/Nor/', '/With/', '/On/', '/At/', '/To/', '/From/', '/By/'); 
$lowercase = array('a', 'an', 'the', 'and', 'of', 'but', 'or', 'for', 'nor', 'with', 'on', 'at', 'to', 'from', 'by'); 

$formatted_tag = preg_replace($patterns, $lowercase, $tag); 

// capitalize first letter of string 
$formatted_tag = ucfirst($formatted_tag); 

echo $formatted_tag; 

這將產生環的主的正確的結果,但我怎麼能避免重複陣列?當我添加新單詞時,將它們匹配起來非常繁瑣。

我確定有一些詞應該包含在我的文件中,是否有任何現有的函數或類可以使用?

+1

這似乎有竅門: http://bpaste.net/show/91wu3ckWxxQ7cgWN4AtJ/ – sberry 2012-08-08 18:48:09

+0

如果你想在輸入上使用此功能,請使用:http://stackoverflow.com/a/40983766/3620727 – Doglas 2016-12-05 21:37:59

回答

6

如果您使用自定義回調preg_replace_callback(),則不需要$lowercase陣列。此外,您目前的方法需要單詞界限,否則它將用androidbAnd替換Androidband。最後,爲N個單詞創建N個正則表達式效率低下且不必要,因爲這可以通過一個正則表達式來完成。

我只想保持一個字陣:

$words = array('A', 'An', 'The', 'And', 'Of', 'But', 'Or', 'For', 'Nor', 'With', 'On', 'At', 'To', 'From', 'By'); 

,創造一個動態正則表達式,完整的單詞邊界,就像這樣:

$regex = '/\b(' . implode('|', $words) . ')\b/i'; 

而現在更換所有的比賽他們的小寫字母對應:

$formatted_tag = preg_replace_callback($regex, function($matches) { 
    return strtolower($matches[1]); 
}, $tag); 
+0

真棒,不知道_callback。我注意到的一個問題是,如果有人鍵入「指環王」,那麼「THE」將保留在所有大寫字母中。我認爲只是在ucwords()之前將整個字符串變成小寫字母,但我不希望在WoW(魔獸世界)等WOW沒有意義的情況下丟失所有大寫字母。我如何將其更改爲不區分大小寫? – Motive 2012-08-08 18:57:10

+0

@MotiveKyle - 這很簡單,在正則表達式中添加'/ i'修飾符:''/ \ b('。implode('|',$ words)。')\ b/i';'我將它編輯成了我的回答。 – nickb 2012-08-08 18:59:11

+0

完美!謝謝! – Motive 2012-08-08 19:11:49

相關問題