mb_strtolower

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

mb_strtolower将字符串转换为小写

说明

mb_strtolower(string $string, ?string $encoding = null): string

返回将所有字母字符转换为小写的 string

参数

string

要转换为小写的 string

encoding

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

返回值

所有字母字符转换为小写的 string

范例

范例 #1 mb_strtolower() 的例子

<?php
$str
= "Mary Had A Little Lamb and She LOVED It So";
$str = mb_strtolower($str);
echo
$str; // 输出 mary had a little lamb and she loved it so
?>

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

<?php
$str
= "Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός";
$str = mb_strtolower($str, 'UTF-8');
echo
$str; // 输出 τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός
?>

注释

strtolower() 相比,'字母' 是由 Unicode 字符属性决定的。因此,此函数的行为不受区域设置的影响,它可以转换任何具有 '字母' 属性的字符,例如带变音符的 a (ä)。

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

参见

添加注释

用户贡献注释 6 个注释

akniep at linklift dot net
12 年前
请注意,当与 UTF-8 一起使用时,mb_strtolower 仅会将标记为 Unicode 属性“大写字母”(“Lu”)的大写字符转换为小写。但是,也有一些字母,例如“字母数字”(Unicode 属性“Nl”),也具有小写和大写变体。这些字符不会被 mb_strtolower 转换!

示例
罗马字母 Ⅰ、Ⅱ、Ⅲ、...、Ⅿ(UTF-8 代码点 8544 到 8559)也存在于它们各自的小写变体 ⅰ、ⅱ、ⅲ、...、ⅿ(UTF-8 代码点 8560 到 8575)中,在我看来,也应该被 mb_strtolower 转换,但它们没有!

大型互联网公司(如 Google)将这两个变体视为语义上相等(因为表示形式仅在大小写上有所不同)。

由于我在互联网上找不到任何关于如何在 PHP 中将所有 UTF8 字符串映射到它们的小写对应物的正确解决方案,所以我提供以下针对 UTF-8 字符串的硬编码扩展的 mb_strtolower 函数

该函数包装了现有的函数 mb_strtolower(),并另外替换了具有小写表示形式的大写 UTF8 字符。由于我在互联网上找不到任何合适的 Unicode 大小写字符表,我检查了前一百万个 UTF8 字符,与 Google 搜索和关键字工具进行了比较,并确定以下 78 个字符为大写字符,未被 mb_strtolower 替换,但具有 UTF8 小写对应形式。

<?php

// 行内注释中的数字显示字符的 Unicode 代码点 (CP)。
function strtolower_utf8_extended( $utf8_string )
{
$additional_replacements = array
(
"Dž" => "dž" // 453 -> 454
, "Lj" => "lj" // 456 -> 457
, "Nj" => "nj" // 459 -> 460
, "Dz" => "dz" // 498 -> 499
, "Ϸ" => "ϸ" // 1015 -> 1016
, "Ϲ" => "ϲ" // 1017 -> 1010
, "Ϻ" => "ϻ" // 1018 -> 1019
, "ᾈ" => "ᾀ" // 8072 -> 8064
, "ᾉ" => "ᾁ" // 8073 -> 8065
, "ᾊ" => "ᾂ" // 8074 -> 8066
, "ᾋ" => "ᾃ" // 8075 -> 8067
, "ᾌ" => "ᾄ" // 8076 -> 8068
, "ᾍ" => "ᾅ" // 8077 -> 8069
, "ᾎ" => "ᾆ" // 8078 -> 8070
, "ᾏ" => "ᾇ" // 8079 -> 8071
, "ᾘ" => "ᾐ" // 8088 -> 8080
, "ᾙ" => "ᾑ" // 8089 -> 8081
, "ᾚ" => "ᾒ" // 8090 -> 8082
, "ᾛ" => "ᾓ" // 8091 -> 8083
, "ᾜ" => "ᾔ" // 8092 -> 8084
, "ᾝ" => "ᾕ" // 8093 -> 8085
, "ᾞ" => "ᾖ" // 8094 -> 8086
, "ᾟ" => "ᾗ" // 8095 -> 8087
, "ᾨ" => "ᾠ" // 8104 -> 8096
, "ᾩ" => "ᾡ" // 8105 -> 8097
, "ᾪ" => "ᾢ" // 8106 -> 8098
, "ᾫ" => "ᾣ" // 8107 -> 8099
, "ᾬ" => "ᾤ" // 8108 -> 8100
, "ᾭ" => "ᾥ" // 8109 -> 8101
, "ᾮ" => "ᾦ" // 8110 -> 8102
, "ᾯ" => "ᾧ" // 8111 -> 8103
, "ᾼ" => "ᾳ" // 8124 -> 8115
, "ῌ" => "ῃ" // 8140 -> 8131
, "ῼ" => "ῳ" // 8188 -> 8179
, "Ⅰ" => "ⅰ" // 8544 -> 8560
, "Ⅱ" => "ⅱ" // 8545 -> 8561
, "Ⅲ" => "ⅲ" // 8546 -> 8562
, "Ⅳ" => "ⅳ" // 8547 -> 8563
, "Ⅴ" => "ⅴ" // 8548 -> 8564
, "Ⅵ" => "ⅵ" // 8549 -> 8565
, "Ⅶ" => "ⅶ" // 8550 -> 8566
, "Ⅷ" => "ⅷ" // 8551 -> 8567
, "Ⅸ" => "ⅸ" // 8552 -> 8568
, "Ⅹ" => "ⅹ" // 8553 -> 8569
, "Ⅺ" => "ⅺ" // 8554 -> 8570
, "Ⅻ" => "ⅻ" // 8555 -> 8571
, "Ⅼ" => "ⅼ" // 8556 -> 8572
, "Ⅽ" => "ⅽ" // 8557 -> 8573
, "Ⅾ" => "ⅾ" // 8558 -> 8574
, "Ⅿ" => "ⅿ" // 8559 -> 8575
, "Ⓐ" => "ⓐ" // 9398 -> 9424
, "Ⓑ" => "ⓑ" // 9399 -> 9425
, "Ⓒ" => "ⓒ" // 9400 -> 9426
, "Ⓓ" => "ⓓ" // 9401 -> 9427
, "Ⓔ" => "ⓔ" // 9402 -> 9428
, "Ⓕ" => "ⓕ" // 9403 -> 9429
, "Ⓖ" => "ⓖ" // 9404 -> 9430
, "Ⓗ" => "ⓗ" // 9405 -> 9431
, "Ⓘ" => "ⓘ" // 9406 -> 9432
, "Ⓙ" => "ⓙ" // 9407 -> 9433
, "Ⓚ" => "ⓚ" // 9408 -> 9434
, "Ⓛ" => "ⓛ" // 9409 -> 9435
, "Ⓜ" => "ⓜ" // 9410 -> 9436
, "Ⓝ" => "ⓝ" // 9411 -> 9437
, "Ⓞ" => "ⓞ" // 9412 -> 9438
, "Ⓟ" => "ⓟ" // 9413 -> 9439
, "Ⓠ" => "ⓠ" // 9414 -> 9440
, "Ⓡ" => "ⓡ" // 9415 -> 9441
, "Ⓢ" => "ⓢ" // 9416 -> 9442
, "Ⓣ" => "ⓣ" // 9417 -> 9443
, "Ⓤ" => "ⓤ" // 9418 -> 9444
, "Ⓥ" => "ⓥ" // 9419 -> 9445
, "Ⓦ" => "ⓦ" // 9420 -> 9446
, "Ⓧ" => "ⓧ" // 9421 -> 9447
, "Ⓨ" => "ⓨ" // 9422 -> 9448
, "Ⓩ" => "ⓩ" // 9423 -> 9449
, "𐐦" => "𐑎" // 66598 -> 66638
, "𐐧" => "𐑏" // 66599 -> 66639
);

$utf8_string = mb_strtolower( $utf8_string, "UTF-8");

$utf8_string = strtr( $utf8_string, $additional_replacements );

return
$utf8_string;
}
//strtolower_utf8_extended()

?>
Philipp H
16 年前
请注意,mb_strtolower() 非常慢,如果您有数据库连接,您可能希望使用它将字符串转换为小写。 即使是 latin1/9 (iso-8859-1/15) 和其他编码也是可能的。

看看我的简单基准测试

<?php

$text
= "Lörem ipßüm dölör ßit ämet, cönßectetüer ädipißcing elit. Sed ligülä. Präeßent jüßtö tellüß, grävidä eü, tempüß ä, mättiß nön, örci. Näm qüiß lörem. Näm äliqüet elit ßed elit. Phäßellüß venenätiß jüßtö eget enim. Dönec nißl. Pröin mättiß venenätiß jüßtö. Sed äliqüäm pörtä örci. Cräß elit nißl, cönvälliß qüiß, tincidünt ät, vehicülä äccümßän, ödiö. Sed möleßtie. Etiäm mölliß feügiät elit. Veßtibülüm änte ipßüm primiß in fäücibüß örci lüctüß et ültriceß pößüere cübiliä Cüräe; Mäecenäß nön nüllä.";

// mb_strtolower()
$timeMB = microtime(true);

for(
$i=0;$i<30000;$i++)
$lower = mb_strtolower("$text/no-cache-$i");

$timeMB = microtime(true) - $timeMB;

// MySQL lower()
$timeSQL = microtime(true);

mysql_query("set names latin1");
for(
$i=0;$i<30000;$i++) {
$r = mysql_fetch_row(mysql_query("select lower('$text/no-cache-$i')"));
$lower = $r[0];
}

$timeSQL = microtime(true) - $timeSQL;

echo
"mb: ".sprintf("%.5f",$timeMB)." sek.<br />";
echo
"sql: ".sprintf("%.5f",$timeSQL)." sek.<br />";

// Result on my notebook:
// mb: 11.50642 sek.
// sql: 5.44143 sek.

?>
fisharebest at gmail dot com
12 年前
大写字母和小写字母之间没有一一对应关系。

土耳其语就是一个很好的例子。在土耳其语中,字母 I/i 有带点的字母大写形式 (İ) 和没有点的字母小写形式 (ı)。

https://en.wikipedia.org/wiki/Dotted_and_dotless_I

这意味着,在不知道数据所在的区域设置的情况下,无法正确地在大写字母和小写字母之间转换。

由于此函数不允许指定区域设置,因此应仅将此函数用于以与英语相同的正字法编写的文本。

虽然它处理一些二合字母,例如荷兰语 ij (ij),但它不处理其他二合字母,例如波兰语 dz (ʣ)。
btherl at yahoo dot com dot au
18 年前
如果在 unicode 字符串上使用此函数,但没有告诉 PHP 它是一个 unicode 字符串,那么您将破坏您的字符串。特别是,在 2 字节 UTF-8 字符中常见的带波浪线的字母大写 'A' 会被转换为带波浪线的字母小写 'a'。

可以通过以下方法正确地处理这个问题:
$str = mb_strtolower($str, mb_detect_encoding($str));

或者,如果您知道您的数据是 UTF-8,只需使用字符串 "UTF-8" 作为第二个参数。

您还应检查 mb_detect_encoding() 是否正在检查您希望它检查的编码,以及是否检测到正确的编码。
Ken Shiro
14 年前
[如果出现以下错误:]
致命错误:调用未定义的函数:mb_strtolower() 在 ????.php 的第 ?? 行

您的服务器上没有可用的 PHP mbstring 扩展,该扩展是处理国际字符集所必需的。检查您的 PHP 配置,并确保 PHP 已使用 --enable-mbstring 编译。

它也适用于
调用未定义的函数 mb_eregi() / mb_strtolower()
Ukio
8 年前
也许它能帮助到某人。
第一个字符大写,其他字符小写。

<?php
function str_split_unicode($str, $l = 0) {
if (
$l > 0) {
$ret = array();
$len = mb_strlen($str, "UTF-8");
for (
$i = 0; $i < $len; $i += $l) {
$ret[] = mb_substr($str, $i, $l, "UTF-8");
}
return
$ret;
}
return
preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
}

function
ToCorrectCase($str){

$str = mb_strtolower($str);
$str_array = str_split_unicode($str);
$str_array[0] = mb_strtoupper($str_array[0]);
$str = '';
foreach (
$str_array as $key){
$str = $str.$key;
}
return
$str;
}
?>
To Top