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 开始,传递负宽度已弃用。

trim_marker

当字符串被截断时添加到字符串末尾的字符串。

encoding

encoding 参数是字符编码。如果省略或为null,则使用内部字符编码值。

返回值

截断的字符串。如果设置了trim_markertrim_marker将替换最后的字符以匹配width

变更日志

版本 描述
8.3.0 现在已弃用向mb_strimwidth()传递负width
8.0.0 encoding现在可以为空。
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
= ['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)
);
}
/* 输出
# 使用 ASCII,字符 == 宽度,因此一切按预期工作
English : Switzerland (bytes=11 chars=11 width=11)
Substring : Swi
Trim width: Swi

# 使用半角片假名,它也工作
Half width: スイス (bytes=9 chars=3 width=3)
Substring : スイス
Trim width: スイス

# 全角片假名是两倍宽,所以我们只得到第一个 'su'!
Full width: スイス (bytes=9 chars=3 width=6)
Substring : スイス
Trim width: ス
*/
>?
jamesgrimshaw2006 at gmail dot com
1 年前
只有当字符串超过宽度时,mb_strimwidth 才会附加 "trim_marker"。

*测试代码*
$HashTags = 'Results';
$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.........
[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