PHP Conference Japan 2024

mb_strcut

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

mb_strcut取得部分字串

說明

mb_strcut(
    字串 $string,
    整數 $start,
    ?整數 $length = null,
    ?字串 $encoding = null
): 字串

mb_strcut() 函式類似 mb_substr(),可以從字串中擷取子字串,但它是以位元組而非字元為單位操作。如果切割位置恰好落在多位元組字元的兩個位元組之間,則切割會從該字元的第一個位元組開始。這也是與 substr() 函式的不同之處,後者會直接在位元組之間切割字串,進而導致位元組序列錯誤。

參數

string

要被切割的 字串

start

如果 start 為非負數,則返回的字串將從 string 中的第 start 個*位元組*位置開始,從零開始計數。例如,在字串 'abcdef' 中,位置 0 的位元組是 'a',位置 2 的位元組是 'c',依此類推。

如果 start 為負數,則返回的字串將從 string 的末尾倒數第 start 個位元組開始。但是,如果負數 start 的絕對值大於字串的長度,則返回的部分將從 string 的開頭開始。

length

*位元組*長度。如果省略或傳入 NULL,則擷取到字串結尾的所有位元組。

如果 length 為負數,則返回的字串將在從 string 末尾倒數的第 length 個位元組處結束。但是,如果負數 length 的絕對值大於 start 位置之後的字元數,則會返回空字串。

encoding

encoding 參數是字元編碼。如果省略或傳入 null,則會使用內部字元編碼值。

回傳值

mb_strcut() 返回由 startlength 參數指定的 string 部分。

更新日誌

版本 說明
8.0.0 encoding 現在可以為 null。

參見

新增註解

使用者貢獻的註解 4 則註解

4
olivthill at gmail dot com
7 年前
以下是用 UTF8 字元的範例,以了解 start 和 length 參數的運作方式

$str_utf8 = utf8_encode("Déjà_vu");
$str_utf8_0 = mb_strcut($str_utf8, 0, 4, "UTF-8"); // Déj
$str_utf8_1 = mb_strcut($str_utf8, 1, 4, "UTF-8"); // éj
$str_utf8_2 = mb_strcut($str_utf8, 2, 4, "UTF-8"); // éj
$str_utf8_3 = mb_strcut($str_utf8, 3, 4, "UTF-8"); // jà_
$str_utf8_4 = mb_strcut($str_utf8, 4, 4, "UTF-8"); // à_v

這個字串包含兩個特殊字元,「é」和「à」,它們在內部以兩個位元組編碼。
請注意,多位元組字元會被移除,而不是在輸出的結尾處被截斷。
還要請注意,對於此字串,截取 1,4 和截取 2,4 的結果是相同的。
4
t dot starling at physics dot unimelb dot edu dot au
20 年前
說明文件和第一位評論者想表達的是,mb_strcut 使用位元組偏移量,而 mb_substr 使用字元偏移量。

mb_strcut 和 mb_substr 似乎都以與 substr 基本相同的方式處理負數和超出範圍的偏移量和長度。一個例外是,如果起始位置太大,則會返回空字串而不是 FALSE。測試表明,mb_strcut 首先計算起始和結束位元組偏移量,然後將每個偏移量左移到最近的字元邊界。
1
David Juhasz
3 年前
這快把我逼瘋了,因為 mb_strcut() 一直返回空字串。 $length 參數似乎有一個最大值 2^32-1 (2147483647)。

可行
<?php
# 輸出:Полуустав
echo mb_strcut('Полуустав', 0, pow(2,31)-1);
?>

不可行
<?php
# 無輸出
echo mb_strcut('Полуустав', 0, pow(2,31));
?>

我的 PHP_INT_MAX 值遠大於 2^32-1,所以我不確定為什麼 $length 的較大值無效。 :(

<?php
# 輸出:9223372036854775807
echo PHP_INT_MAX;
?>
-1
oyag02 at yahoo dot co dot jp
21 年前
mb_substr 和 mb_substr 的區別

範例
mb_strcut('I_ROHA', 1, 2) 返回 'I_'。視為位元組流處理。
mb_substr('I_ROHA', 1, 2) 返回 'ROHA'。視為字元流處理。

# 'I_' 'RO' 'HA' 表示多位元組字元
To Top