ConFoo 2025

mb_strimwidth

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

mb_strimwidth指定した幅で文字列を丸める

説明

mb_strimwidth(
    string $string,
    int $start,
    int $width,
    string $trim_marker = "",
    ?string $encoding = null
): string

文字列 string を指定した幅 width で丸めます。 半角文字は 1 として、 全角文字は 2 として数えます。 東アジアの文字の長さに関する詳細は » http://www.unicode.org/reports/tr11/ を参照ください。

パラメータ

string

丸めたい文字列。

start

開始位置のオフセット。文字列の始めからの文字数 (最初の文字は 0) です。 負のオフセットは、文字列の末尾からのオフセットと解釈されます。

width

丸める幅。 負の値を指定すると、文字列の末尾からの幅を数えます。

注意:

負の値を指定することは、PHP 8.3.0 以降では推奨されなくなっています。

trim_marker

丸めた後にその文字列の最後に追加される文字列。

encoding

encoding パラメータには文字エンコーディングを指定します。省略した場合、もしくは null の場合は、 内部文字エンコーディングを使用します。

戻り値

丸められた文字列を返します。 trim_marker が設定された場合、 width にマッチする最後の文字を trim_marker で置き換えます。

変更履歴

バージョン 説明
8.3.0 mb_strimwidth() に負の width を渡すことは、推奨されなくなりました。
8.0.0 encoding は、nullable になりました。
7.1.0 負の startwidth をサポートするようになりました。

例1 mb_strimwidth() の例

<?php
echo mb_strimwidth("Hello World", 0, 10, "...");
// "Hello W..." と出力します
?>

参考

add a note

User Contributed Notes 2 notes

up
2
dregad at NOSPAM-mantisbt dot org
1 year ago
I see a lot of usage in the field where people rely on this function to truncate a string to a given length and append some chars at the end following example #1 in the above documentation.

While this works just fine with Western alphabets, it should be noted that a string's width is NOT necessarily the same as its length.

In Chinese, Japanese and Korean, some characters can be represented as full or half width, which may lead to unexpected results...

<?php
$str
= ['English' => 'Switzerland',
'Half width' => 'スイス',
'Full width' => 'スイス',
];
foreach (
$str as $w => $s) {
printf("%-10s: %s (bytes=%d chars=%d width=%d)\nSubstring : %s\nTrim width: %s\n\n",
$w, $s,
strlen($s), mb_strlen($s), mb_strwidth($s),
mb_substr($s, 0, 3),
mb_strimwidth($s, 0, 3)
);
}
/* Output
# With ASCII, chars == width, so everything works as expected
English : Switzerland (bytes=11 chars=11 width=11)
Substring : Swi
Trim width: Swi

# With half-width katakanas, it works too
Half width: スイス (bytes=9 chars=3 width=3)
Substring : スイス
Trim width: スイス

# Full-width katakanas are twice as wide, so we only get the 1st 'su' !
Full width: スイス (bytes=9 chars=3 width=6)
Substring : スイス
Trim width: ス
*/
>?
up
1
jamesgrimshaw2006 at gmail dot com
1 year ago
mb_strimwidth will only append "trim_marker" if the string is over the width.

*test code*
$HashTags = 'Results';
$socialmediatext = 'abcdefghijklmnopqrstuvwxyz';
for( $i=0; $i<=20; $i++ )
{
$socialmediatext .= '.';
$Twittext = mb_strimwidth($socialmediatext,0,35,$HashTags);
echo "<p>[".strlen($Twittext)."]$Twittext</p>";
}

*output*
[27]abcdefghijklmnopqrstuvwxyz.
[28]abcdefghijklmnopqrstuvwxyz..
[29]abcdefghijklmnopqrstuvwxyz...
[30]abcdefghijklmnopqrstuvwxyz....
[31]abcdefghijklmnopqrstuvwxyz.....
[32]abcdefghijklmnopqrstuvwxyz......
[33]abcdefghijklmnopqrstuvwxyz.......
[34]abcdefghijklmnopqrstuvwxyz........
[35]abcdefghijklmnopqrstuvwxyz.........
[35]abcdefghijklmnopqrstuvwxyz..Results
[35]abcdefghijklmnopqrstuvwxyz..Results
[35]abcdefghijklmnopqrstuvwxyz..Results
[35]abcdefghijklmnopqrstuvwxyz..Results
[35]abcdefghijklmnopqrstuvwxyz..Results
[35]abcdefghijklmnopqrstuvwxyz..Results
[35]abcdefghijklmnopqrstuvwxyz..Results
[35]abcdefghijklmnopqrstuvwxyz..Results
[35]abcdefghijklmnopqrstuvwxyz..Results
[35]abcdefghijklmnopqrstuvwxyz..Results
[35]abcdefghijklmnopqrstuvwxyz..Results
[35]abcdefghijklmnopqrstuvwxyz..Results
To Top