由于此函数的先前发布版本不处理 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;
}
?>