由于此函数的先前发布版本无法处理 UTF-8 字符,我只是尝试用 mb_convert_case 替换 ucfirst,但随后在循环遍历分隔符时任何先前的大小写折叠都丢失了。
因此,我决定对输入字符串执行 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;
}
?>