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

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

参数

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 的大小写折叠版本。

变更日志

版本 说明
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/

参见

添加注释

用户贡献的注释 11 个注释

12
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;
}
11
agash at freemail dot hu
15 年前
由于此函数的先前发布版本无法处理 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" )) {
/*
* 异常情况以小写表示你不希望转换的词语
* 全部大写表示任何你不希望转换为标题格式的词语
* 但应该转换为大写,例如:
* 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;
}

?>
5
Rasa Ravi at tantrajoga dot cz
19 年前
针对捷克语字符
<?php
$text
= mb_convert_case($text, MB_CASE_LOWER, "Windows-1251");
?>
正确的编码 Windows-1250 无效(参见 mb_list_encodings 列表),但 Windows-1251 将执行相同的 100%。strtolower() 函数忽略带有变音符号的捷克语字符。
3
info at yasarnet dot com
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);
}
2
dave at wp dot pl
8 年前
MB_CASE_TITLE 不会更改引号中的字母。

示例
mb_convert_case('AAA "aaa"', MB_CASE_TITLE);
// 结果:Aaa "aaa"
1
the at psychoticneurotic dot com
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;
}
?>
0
turabgarip at gmail dot com
2 个月前
与其他字符串函数一样,此函数在处理土耳其语“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),
// PHP 在 i 和 ı 位于单词开头时表现不同
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);
}

?>

如您所见,它使用了 match 语法,这需要 PHP 8。对于较低版本,您可以用 switch 语法进行替换。我还没有测试过它用于大小写折叠。如果您需要它,只需在 match 中添加另一个条件即可。
0
tavhane at gmail dot com
6 年前
用于土耳其语简化

$str = mb_convert_case(str_replace(['i','I'], ['İ','ı'], $str), MB_CASE_TITLE,"UTF-8");
-2
Anonymous
2 年前
$str = "Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός";
$str = mb_convert_case($str, MB_CASE_UPPER, "UTF-8");
此转换没有给出您已经发布的示例
而是这个

$str = mb_convert_case($str, MB_CASE_UPPER, "UTF-8");
"ΤΆΧΙΣΤΗ ΑΛΏΠΗΞ ΒΑΦΉΣ ΨΗΜΈΝΗ ΓΗ, ΔΡΑΣΚΕΛΊΖΕΙ ΥΠΈΡ ΝΩΘΡΟΎ ΚΥΝΌΣ"
-3
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;

}
-7
cataphract at php dot net
14 年前
这是一个 mb_convert_case 的变体,它只适用于 UTF-8 字符串,并且不会将任何内容转换为小写。

这避免了将 "AAA aaa" 变成 "Aaa Aaa";它将 "AAA aaa" 映射到 ""AAA Aaa"。

<?php
function mb_convert_case_utf8_variation($s) {
$arr = preg_split("//u", $s, -1, PREG_SPLIT_NO_EMPTY);
$result = "";
$mode = false;
foreach (
$arr as $char) {
$res = preg_match(
'/\\p{Mn}|\\p{Me}|\\p{Cf}|\\p{Lm}|\\p{Sk}|\\p{Lu}|\\p{Ll}|'.
'\\p{Lt}|\\p{Sk}|\\p{Cs}/u', $char) == 1;
if (
$mode) {
if (!
$res)
$mode = false;
}
elseif (
$res) {
$mode = true;
$char = mb_convert_case($char, MB_CASE_TITLE, "UTF-8");
}
$result .= $char;
}

return
$result;
}
?>
To Top