2024年PHP开发者大会(日本)

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

变更日志

版本 描述
8.3.0 为希腊字母sigma实现了条件大小写规则。

示例

示例 #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
13年前
请注意,当与 UTF-8 一起使用时,mb_strtolower 仅会将标有 Unicode 属性“大写字母”(“Lu”)的大写字符转换为小写。但是,还有一些字母,例如“字母数字”(Unicode 属性“Nl”),也具有小写和大写变体。这些字符不会被 mb_strtolower 转换!

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

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

由于我在互联网上找不到关于如何将所有 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
17年前
请注意,如果您有数据库连接,则`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)." 秒<br />";
echo
"sql: ".sprintf("%.5f",$timeSQL)." 秒<br />";

// 笔记本电脑上的结果:
// mb: 11.50642 秒
// sql: 5.44143 秒

?>
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
19年前
如果在 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年前
[如果出现此错误:]
致命错误:在 ????.php 的第 ?? 行调用未定义函数:mb_strtolower()

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

这也适用于
调用未定义函数 mb_eregi() / mb_strtolower()
Ukio
9年前
也许它能帮到某人。
首字母大写,其余小写。

<?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