2012-05-28 60 views
2

有沒有人有這樣的PHP解決方案?正確Case'ing沒有打破像IBM,美國航空航天局等

的目標是有把這些

HELLO WORLD 的hello world 你好IBM

函數,分別返回這些

的Hello World 的Hello World 你好IBM

+2

沒有銀彈,那裏有永遠在這種情況下的例外 - 還等什麼,你首先做什麼? – 2012-05-28 00:27:23

+0

另請參見:[編程中人名的大寫](http://stackoverflow.com/questions/2466706/capitalization-of-person-names-in-programming/)。 –

回答

3

蘇格蘭的麥克唐納先生喜歡他的名字大寫,而愛爾蘭的麥克唐納更喜歡這樣。如果事先不知道你指的是哪一位先生,那麼就很難知道哪一位是「正確的」,這比文件中的文字要更多的上下文。

此外,英國廣播公司(或者說是英國廣播公司?)已採取拼寫一些名稱,如美國國家航空航天局和北約。它刺向我;我非常不喜歡它。但這就是他們現在所做的。丙烯酸樹脂(或者一些人喜歡稱之爲「初始主義」)什麼時候成爲一個詞呢?

+0

我聽到你的聲音,但嘿,你沒有什麼,我可以做到這一點。但是當我們面臨將數據從一個地方移動到另一個地方的挑戰,並且您的目標是儘可能多地清理數據時,您可能會認爲如果一個單詞最初是用一些大寫字母書寫的,可能有很好的理由,所以我們不去碰它,我們只是略過它。在這種情況下,美國宇航局,麥當勞和麥克唐納都會按照原樣把它變成另一端。問題是這是什麼正則表達式? –

2

這是一個黑客,你可以存儲一個首字母縮略詞列表,你想保持大寫,然後比較字符串中的單詞與$exceptions列表。 雖然喬納森是正確的,如果它的名字你的工作而不縮寫,那麼這種解決方案是沒用的。但顯然如果來自蘇格蘭的麥克唐納先生處於正確的情況下,那麼它不會改變。

See it in action

<?php 
$exceptions = array("to", "a", "the", "of", "by", "and","on","those","with", 
        "NASA","FBI","BBC","IBM","TV"); 

$string = "While McBeth and Mr MacDonald from Scotland 
was using her IBM computer to watch a ripped tv show from the BBC, 
she was being watched by the FBI, Those little rascals were 
using a NASA satellite to spy on her."; 

echo titleCase($string, $exceptions); 
/* 
While McBeth and Mr MacDonald from Scotland 
was using her IBM computer to watch a ripped TV show from the BBC, 
she was being watched by the FBI, Those little rascals were 
using a NASA satellite to spy on her. 
*/ 

/*Your case example 
    Hello World Hello World Hello IBM, BBC and NASA. 
*/ 
echo titleCase('HELLO WORLD hello world Hello IBM, BBC and NASA.', $exceptions,true); 


function titleCase($string, $exceptions = array(), $ucfirst=false) { 
    $words = explode(' ', $string); 
    $newwords = array(); 
    $i=0; 
    foreach ($words as $word){ 
     // trim white space or newlines from string 
     $word=trim($word); 
     // trim ending coomer if any 
     if (in_array(strtoupper(trim($word,',.')), $exceptions)){ 
      // check exceptions list for any words that should be in upper case 
      $word = strtoupper($word); 
     } else{ 
      // convert to uppercase if $ucfirst = true 
      if($ucfirst==true){ 
       // check exceptions list for should not be upper case 
       if(!in_array(trim($word,','), $exceptions)){ 
        $word = strtolower($word); 
        $word = ucfirst($word); 
       } 
      } 
     } 
     // upper case the first word in the string 
     if($i==0){$word = ucfirst($word);} 
     array_push($newwords, $word); 
     $i++; 
    } 
    $string = join(' ', $newwords); 
return $string; 
} 
?> 
+0

謝謝勞倫斯的功能,但是,我沒有這樣的列表。這是一個熱門名單,它是動態的。如果一次處理一個單詞並跳過這些單詞,如果單詞包含從第二個字符開始的大寫字母並且開頭。這是什麼正則表達式?這種方法會將所有的單詞轉換爲標題大小寫(無需修改諸如IBM,McDonald,WordPress等單詞)。 –

+0

對於任何比較,您都需要某種參考。 –

相關問題