PHP Conference Japan 2024

mb_strimwidth

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

mb_strimwidth取得指定寬度的截斷字串

說明

mb_strimwidth(
    字串 $string,
    整數 $start,
    整數 $width,
    字串 $trim_marker = "",
    ?字串 $encoding = null
): 字串

將字串 string 截斷至指定的 width 寬度,其中半形字元計為 1,全形字元計為 2。關於東亞字元寬度的詳細資訊,請參閱 » http://www.unicode.org/reports/tr11/

參數

string

要被解碼的 字串

start

起始位置偏移量。從字串開頭算起的字元數(第一個字元為 0),或者如果 start 為負數,則從字串結尾算起的字元數。

width

所需的截斷寬度。如果指定負的寬度,則從字串結尾算起。

注意事項:

自 PHP 8.3.0 起,不建議傳遞負的 width 值。

trim_marker

當字串被截斷時,會加到字串結尾的字串。

encoding

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

回傳值

截斷後的 字串。如果設定了 trim_markertrim_marker 會取代最後的字元以符合 width

更新日誌

版本 說明
8.3.0 傳遞負的 width 值給 mb_strimwidth() 現已不建議使用。
8.0.0 encoding 現在可以為 null。
7.1.0 已新增支援負的 startwidth 值。

範例

範例 #1 mb_strimwidth() 範例

<?php
echo mb_strimwidth("Hello World", 0, 10, "...");
// 輸出: "Hello W..."
?>

另請參閱

新增註釋

使用者貢獻的註釋 2 則註釋

dregad at NOSPAM-mantisbt dot org
1 年前
我看到很多實際應用中,人們依賴這個函式來將字串截斷到給定的長度,並在結尾附加一些字元,就像上面文件中的範例 #1 一樣。

雖然這在西方字母中運作良好,但應該注意的是,字串的寬度不一定與其長度相同。

在中文、日文和韓文中,某些字元可以表示為全形或半形,這可能會導致非預期的結果...

<?php
$str
= ['英文' => '瑞士',
'半形' => 'スイス',
'全形' => 'スイス',
];
foreach (
$str as $w => $s) {
printf("%-10s: %s (位元組=%d 字元數=%d 寬度=%d)\n子字串: %s\n修剪寬度: %s\n\n",
$w, $s,
strlen($s), mb_strlen($s), mb_strwidth($s),
mb_substr($s, 0, 3),
mb_strimwidth($s, 0, 3)
);
}
/* 輸出
# 使用 ASCII 時,字元數 == 寬度,所以一切如預期
英文 : 瑞士 (位元組=6 字元數=2 寬度=2)
子字串: 瑞士
修剪寬度: 瑞士

# 使用半形片假名時,也一樣
半形 : スイス (位元組=9 字元數=3 寬度=3)
子字串: スイス
修剪寬度: スイス

# 全形片假名的寬度是兩倍,所以我們只得到第一個「ス」!
全形 : スイス (位元組=9 字元數=3 寬度=6)
子字串: スイス
修剪寬度: ス
*/
>?
jamesgrimshaw2006 at gmail dot com
1 年前
mb_strimwidth 只會在字串超過指定寬度時附加「trim_marker」。

*測試程式碼*
$HashTags = '結果';
$socialmediatext = 'abcdefghijklmnopqrstuvwxyz';
for( $i=0; $i<=20; $i++ )
{
$socialmediatext .= '.';
$Twittext = mb_strimwidth($socialmediatext,0,35,$HashTags);
echo "<p>[".strlen($Twittext)."]$Twittext</p>";
}

*輸出*
[27]abcdefghijklmnopqrstuvwxyz.
[28]abcdefghijklmnopqrstuvwxyz..
[29]abcdefghijklmnopqrstuvwxyz...
[30]abcdefghijklmnopqrstuvwxyz....
[31]abcdefghijklmnopqrstuvwxyz.....
[32]abcdefghijklmnopqrstuvwxyz......
[33]abcdefghijklmnopqrstuvwxyz.......
[34]abcdefghijklmnopqrstuvwxyz........
[35]abcdefghijklmnopqrstuvwxyz.........
[37]abcdefghijklmnopqrstuvwxyz..結果
[37]abcdefghijklmnopqrstuvwxyz..結果
[37]abcdefghijklmnopqrstuvwxyz..結果
[37]abcdefghijklmnopqrstuvwxyz..結果
[37]abcdefghijklmnopqrstuvwxyz..結果
[37]abcdefghijklmnopqrstuvwxyz..結果
[37]abcdefghijklmnopqrstuvwxyz..結果
[37]abcdefghijklmnopqrstuvwxyz..結果
[37]abcdefghijklmnopqrstuvwxyz..結果
[37]abcdefghijklmnopqrstuvwxyz..結果
[37]abcdefghijklmnopqrstuvwxyz..結果
[37]abcdefghijklmnopqrstuvwxyz..結果
To Top