PHP Conference Japan 2024

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 mb_strtolower() 使用非拉丁 UTF-8 文字的範例

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

備註

strtolower() 相比,「字母」是由 Unicode 字元屬性決定的。因此,此函式的行為不受地區設定影響,它可以轉換任何具有「字母」屬性的字元,例如 a-umlaut (ä)。

如需 Unicode 屬性的詳細資訊,請參閱 » http://www.unicode.org/reports/tr21/

參見

新增筆記

使用者貢獻的筆記 6 則筆記

22
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 轉換,但它們不會!

大型網路公司(如 Google)會將這兩種變體視為語義上相同(因為表示法僅在大小寫上有所不同)。

由於我沒有在網路上找到任何關於如何在 PHP 中將所有 UTF8 字串對應到它們的小寫對應項的正確解決方案,我提供了以下針對 UTF-8 字串的硬編碼延伸 mb_strtolower 函式

該函式包裝了現有的函式 mb_strtolower(),並且額外地將存在小寫表示形式的大寫 UTF8 字元替換掉。由於我無法在網路上找到任何正確的 Unicode 大寫和小寫字元表,我根據 Google 搜尋和關鍵字工具檢查了前一百萬個 UTF8 字元,並將以下 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()

?>
17
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)." sek.<br />";
echo
"sql: ".sprintf("%.5f",$timeSQL)." sek.<br />";

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

?>
10
fisharebest at gmail dot com
12 年前
大寫字母和小寫字母之間並非一一對應。

土耳其語就是一個很好的例子。在土耳其語中,字母 I/i 有一個帶點的大寫形式 (İ) 和一個不帶點的小寫形式 (ı)。

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

這表示若不知道資料的語系,就無法正確地在大寫和小寫之間轉換。

由於此函式不允許您指定語系,因此您應該只將此函式用於以與英文相同拼寫法的語言撰寫的文字。

雖然它確實可以處理一些二合字母,例如荷蘭語的 ij (ij),但它無法處理其他字母,例如波蘭語的 dz (ʣ)。
6
btherl at yahoo dot com dot au
19 年前
如果您在未告知 PHP 它是 Unicode 字串的情況下,在此字串上使用此函式,則您的字串將會損毀。特別是,帶有波浪符號的大寫 'A',在 2 位元組 UTF-8 字元中很常見,會轉換為帶有波浪符號的小寫 'a'。

這可以透過以下方式正確處理
$str = mb_strtolower($str, mb_detect_encoding($str));

或者,如果您知道您的資料是 UTF-8,只需使用字串 "UTF-8" 作為第二個引數即可。

您還應該檢查 mb_detect_encoding() 是否正在檢查您希望它檢查的編碼,並且是否正在偵測正確的編碼。
5
Ken Shiro
14 年前
[如果您收到此錯誤:]
Fatal error: Call to undefined function: mb_strtolower() in ????.php on line ??

您的伺服器上沒有可處理國際字元集的 PHP mbstring 擴充功能。檢查您的 PHP 設定,並確定 PHP 已使用 --enable-mbstring 編譯。

這也適用於
Call to undefined function mb_eregi() / mb_strtolower()
2
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