由於先前發布的此函式版本無法處理 UTF-8 字元,我只是嘗試將 ucfirst 取代為 mb_convert_case,但是隨後在迴圈處理分隔符號時,任何先前的大小寫轉換都會遺失。
因此,我決定對輸入字串執行 mb_convert_case(它還處理大寫的單字,這些單字在執行區分大小寫的搜尋時也可能會有問題),然後在之後執行其餘的檢查。
與 mb_convert_case 一樣,單字會大寫,我也為例外新增了小寫轉換,但是,基於上述原因,我保留了 ucfirst 不變。
現在它也適用於 utf-8 字串,但以 UTF-8 字元結尾的字串分隔符號除外("Mcádám" 不變,而 "mcdunno's" 會轉換為 "McDunno's",而 "ökrös-TÓTH éDUa" 也會放入正確的格式中)
我將它用於檢查使用者在姓名和地址上的輸入,因此例外清單也包含一些匈牙利文單字。
<?php
function titleCase($string, $delimiters = array(" ", "-", ".", "'", "O'", "Mc"), $exceptions = array("út", "u", "s", "és", "utca", "tér", "krt", "körút", "sétány", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII", "XIII", "XIV", "XV", "XVI", "XVII", "XVIII", "XIX", "XX", "XXI", "XXII", "XXIII", "XXIV", "XXV", "XXVI", "XXVII", "XXVIII", "XXIX", "XXX" )) {
$string = mb_convert_case($string, MB_CASE_TITLE, "UTF-8");
foreach ($delimiters as $dlnr => $delimiter){
$words = explode($delimiter, $string);
$newwords = array();
foreach ($words as $wordnr => $word){
if (in_array(mb_strtoupper($word, "UTF-8"), $exceptions)){
$word = mb_strtoupper($word, "UTF-8");
}
elseif (in_array(mb_strtolower($word, "UTF-8"), $exceptions)){
$word = mb_strtolower($word, "UTF-8");
}
elseif (!in_array($word, $exceptions) ){
$word = ucfirst($word);
}
array_push($newwords, $word);
}
$string = join($delimiter, $newwords);
}return $string;
}
?>