2012-04-13 91 views
1

我想正常化(所以規範化)的字符串進入正常形式的名稱:PHP:規範化字符串

  1. 名字的第一個字母大寫

這個困難是現在以第二名和第三名遵守此規定。

我的方法:

public function namilize($string) 
{ 
    $strings = explode(' ', $string); 
    foreach ($strings as $string) { 
     $string = ucfirst(strtolower($string)); 
    } 
    $string = implode(' ', $strings); 

    return $string; 
} 

不知何故,

$string = ucfirst(strtolower($string)); 

失敗。

我需要糾正什麼? 有沒有更好的方法?

問候

編輯:

嗨,

感謝大家所有的意見和解答。 我發現了另一個「現代」的方法:

public function namilize($string) 
{ 
    $string = mb_convert_case($string, MB_CASE_TITLE, mb_detect_encoding($string)); 
} 

當我現在會額外增加一些正則表達式MC和O公司比起來,完全:)

+4

嘗試'ucwords($字符串)' – thetaiko 2012-04-13 14:46:34

+0

我完全不明白你爲什麼要擺在首位的爆炸'$ string'。 – hjpotter92 2012-04-13 14:47:07

+3

你打算怎麼處理像McVeigh這樣的名字? – ceejayoz 2012-04-13 14:47:08

回答

2
建議

請注意,這將適用於名稱,如John O'Brian,James McManus等。對於其他名稱的前綴如McManus,只需將該前綴添加到preg_match()即可。顯然,這會產生誤報的可能性,但沒有任何方法可以100%萬無一失。

1

你必須通過引用傳遞的$字符串,記在&

public function namilize($string) 
{ 
    $strings = explode(' ', $string); 
    foreach ($strings as &$string) { 
     $string = ucfirst(strtolower($string)); 
    } 
    $string = implode(' ', $strings); 

    return $string; 
} 

或者使用功能由@thetaikoucwords($string)

1

foreach中的$ string將只存儲最後一次迭代(或姓氏)。這並不重要,但因爲foreach中的變量不會用於輸出。內爆只是解除了你對爆炸所做的事情,所以你最終會得到與輸入完全相同的輸出。我改變了變量名是在這個例子更具描述:

function namilize($name_in) 
{ 
    $a_names = explode(' ', $name_in); //explode string into array 
    foreach ($a_names as $name) { 
     $a_fullname[] = ucfirst(strtolower($name)); //build array of proper case names 
    }  
    $string = implode(' ', $a_fullname); //convert array into string 
    return $string; 
}