PHP Conference Japan 2024

mb_convert_case

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

mb_convert_case对字符串执行大小写折叠

描述

mb_convert_case(string $string, int $mode, ?string $encoding = null): string

根据 mode 指定的方式转换 string,并对其执行大小写折叠。

参数

string

要转换的 string

mode

转换模式。它可以是 MB_CASE_UPPERMB_CASE_LOWERMB_CASE_TITLEMB_CASE_FOLDMB_CASE_UPPER_SIMPLEMB_CASE_LOWER_SIMPLEMB_CASE_TITLE_SIMPLEMB_CASE_FOLD_SIMPLE 之一。

encoding

encoding 参数是字符编码。如果省略或为 null,则使用内部字符编码值。

返回值

根据 mode 指定的方式转换的 string 的大小写折叠版本。

变更日志

版本 描述
8.3.0 为希腊字母 sigma 实现了条件大小写规则,这些规则仅适用于 MB_CASE_LOWERMB_CASE_TITLE 模式,不适用于 MB_CASE_LOWER_SIMPLEMB_CASE_TITLE_SIMPLE
7.3.0 添加了对 MB_CASE_FOLDMB_CASE_UPPER_SIMPLEMB_CASE_LOWER_SIMPLEMB_CASE_TITLE_SIMPLEMB_CASE_FOLD_SIMPLE 作为 mode 的支持。

示例

示例 #1 mb_convert_case() 示例

<?php
$str
= "mary had a Little lamb and she loved it so";
$str = mb_convert_case($str, MB_CASE_UPPER, "UTF-8");
echo
$str; // 输出 MARY HAD A LITTLE LAMB AND SHE LOVED IT SO
$str = mb_convert_case($str, MB_CASE_TITLE, "UTF-8");
echo
$str; // 输出 Mary Had A Little Lamb And She Loved It So
?>

示例 #2 使用非拉丁 UTF-8 文本的 mb_convert_case() 示例

<?php
$str
= "Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός";
$str = mb_convert_case($str, MB_CASE_UPPER, "UTF-8");
echo
$str; // 输出 ΤΆΧΙΣΤΗ ΑΛΏΠΗΞ ΒΑΦΉΣ ΨΗΜΈΝΗ ΓΗ, ΔΡΑΣΚΕΛΊΖΕΙ ΥΠΈΡ ΝΩΘΡΟΎ ΚΥΝΌΣ
$str = mb_convert_case($str, MB_CASE_TITLE, "UTF-8");
echo
$str; // 输出 Τάχιστη Αλώπηξ Βαφήσ Ψημένη Γη, Δρασκελίζει Υπέρ Νωθρού Κυνόσ
?>

备注

与标准大小写折叠函数(如 strtolower()strtoupper())相比,大小写折叠是基于 Unicode 字符属性执行的。因此,此函数的行为不受区域设置的影响,它可以转换任何具有“字母”属性的字符,例如变音符 a(ä)。

有关 Unicode 属性的更多信息,请参阅 » http://www.unicode.org/reports/tr21/

参见

添加注释

用户贡献的注释 10 条注释

alNzy
4 年前
您可以使用此函数修复与土耳其语“ı”、“I”、“i”、“İ”字符相关的问题。此函数还会将奇怪的“i̇”字符替换为常规的“i”字符(“i̇ => i”)。

function mb_convert_case_tr($str, $type, $encoding = "UTF-8")
{

switch ($type) {
case "u"
case "upper"
case MB_CASE_UPPER
$type = MB_CASE_UPPER;
break;
case "l"
case "lower"
case MB_CASE_LOWER
$type = MB_CASE_LOWER;
break;
case "t"
case "title"
case MB_CASE_TITLE
$type = MB_CASE_TITLE;
break;
}

$str = str_replace("i", "İ", $str);
$str = str_replace("I", "ı", $str);

$str = mb_convert_case($str, $type, $encoding);
$str = str_replace("i̇", "i", $str);

return $str;
}
agash at freemail dot hu
15 年前
由于此函数的先前发布版本不处理 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" )) {
/*
* 异常列表中的小写单词是不希望被转换的
* 异常列表中全部大写的单词是不希望被转换为标题大小写的
* 但应该被转换为大写,例如:
* king henry viii 或 king henry Viii 应该为 King Henry VIII
*/
$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) ){
// 转换为大写(仅限非 UTF8)

$word = ucfirst($word);

}
array_push($newwords, $word);
}
$string = join($delimiter, $newwords);
}
//foreach
return $string;
}

?>
Rasa Ravi (tantrajoga.cz)
19 年前
针对捷克字符
<?php
$text
= mb_convert_case($text, MB_CASE_LOWER, "Windows-1251");
?>
正确的编码 Windows-1250 无效(请参阅列表 mb_list_encodings),但 Windows-1251 可以达到相同的效果。函数 strtolower() 会忽略带有变音符号的捷克字符。
[email protected]
16 年前
在我的案例中,以下方法可以将 UTF-8 编码的字符串首字母大写。

function capitalize($str, $encoding = 'UTF-8') {
return mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding) . mb_strtolower(mb_substr($str, 1, mb_strlen($str), $encoding), $encoding);
}
[email protected]
8 年前
MB_CASE_TITLE 不会更改引号内的字母。

示例
mb_convert_case('AAA "aaa"', MB_CASE_TITLE);
// 结果:Aaa "aaa"
[email protected]
15 年前
基于 Justin 和 Alex 的工作...

此函数允许您指定要分割的定界符(不仅仅是默认的空格)。现在您可以正确地将爱尔兰姓名和带连字符的单词大写(如果您需要)!

<?php
function titleCase($string, $delimiters = array(" ", "-", "O'"), $exceptions = array("to", "a", "the", "of", "by", "and", "with", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X")) {
/*
* 异常列表中的小写单词是不希望被转换的
* 异常列表中全部大写的单词是不希望被转换为标题大小写的
* 但应该被转换为大写,例如:
* king henry viii 或 king henry Viii 应该为 King Henry VIII
*/
foreach ($delimiters as $delimiter){
$words = explode($delimiter, $string);
$newwords = array();
foreach (
$words as $word){
if (
in_array(strtoupper($word), $exceptions)){
// 检查异常列表中是否有任何应该大写的单词
$word = strtoupper($word);
} elseif (!
in_array($word, $exceptions)){
// 转换为大写
$word = ucfirst($word);
}
array_push($newwords, $word);
}
$string = join($delimiter, $newwords);
}
return
$string;
}
?>
[email protected]
6 个月前
与其他字符串函数一样,此函数在处理土耳其语的“i”时也存在问题。2015 年有一个关于此问题的错误报告,但 PHP 团队表示“未实现特定于语言的条件特殊情况映射”,尽管实际上它破坏了函数的逻辑,使其无法用于此目的。

https://bugs.php.net/bug.php?id=70072

问题源于拉丁语中的字母“i”与土耳其语中的“i”完全不同。土耳其语的“ı”大写为“I”;而拉丁语的“I”大写实际上是大写“i”,而不是“ı”。

PHP 在某些情况下会考虑这一点,而在其他情况下则会忽略它;这会导致不可预测的行为。当相关字母位于单词的中间或开头时,当一些多字节字符紧邻标准拉丁字符或其他多字节字符时,等等。这些情况的行为都不同,这显然是错误的。

有一些用户笔记试图解决这个问题,但效率不高。因为其中一些没有涵盖单词边界,而一些则会生成非标准字符。以下是我测试过并使用了一段时间的方法



<?php

function mb_convert_case_i(string $string, int $mode = MB_CASE_TITLE, string $encoding = 'UTF-8'): string {
// 土耳其语“i”是一个特殊情况
$string = match($mode) {
MB_CASE_UPPER, MB_CASE_UPPER_SIMPLE => str_replace(['i', 'ı'], ['İ', 'I'], $string),
MB_CASE_LOWER, MB_CASE_LOWER_SIMPLE => str_replace(['İ', 'I'], ['i', 'ı'], $string),
// 当 i 和 ı 在单词开头时,PHP 的行为有所不同
MB_CASE_TITLE, MB_CASE_TITLE_SIMPLE => preg_replace(['/İ/u', '/I/u', '/\b(i)/u'], ['i', 'ı', 'İ'], $string),
default =>
$string,
};
return
mb_convert_case($string, $mode, $encoding);
}

?>

正如您所注意到的,它使用了需要 PHP 8 的 match 语法。对于较低版本,您可以使用 switch 正确替换它。我还没有针对大小写折叠测试它。如果您需要它,只需在 match 中添加另一个条件。
tavhane at gmail dot com
6 年前
对于土耳其语简单

$str = mb_convert_case(str_replace(['i','I'], ['İ','ı'], $str), MB_CASE_TITLE,"UTF-8");
匿名用户
3 年前
$str = "Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός";
$str = mb_convert_case($str, MB_CASE_UPPER, "UTF-8");
此转换未给出您已发布的示例
但此转换结果为

$str = mb_convert_case($str, MB_CASE_UPPER, "UTF-8");
"ΤΆΧΙΣΤΗ ΑΛΏΠΗΞ ΒΑΦΉΣ ΨΗΜΈΝΗ ΓΗ, ΔΡΑΣΚΕΛΊΖΕΙ ΥΠΈΡ ΝΩΘΡΟΎ ΚΥΝΌΣ"
webenformasyon at gmail dot com
6 年前
对于土耳其语,I => i 和 i => I 的转换存在问题。它必须是 I => ı 和 i => İ,所以我的简单解决方案是

public function title_case_turkish($str){


$str = str_replace("i", "İ", $str);
$str = str_replace("I", "ı", $str);

$str = mb_convert_case($str, MB_CASE_TITLE,"UTF-8");

return $str;

}
To Top