Menu

PHP substr():截取字符串的一部分

substr($string, $offset, $length) 返回字符串的一部分。学习负数偏移量、获取开头或末尾的字符、处理中文、日文等 UTF-8 文本的 mb_substr、substr_count,以及截断文本并加省略号。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

substr($string, $offset, $length) 返回 $string 中从位置 $offset(从 0 开始计算)开始、长度为 $length 个字符的部分。substr('Hello world', 0, 5) 返回 "Hello"。省略 $length 就会一直取到末尾。

substr() 按字节计数。对英文文本来说,字节数和字符数相同,但对日文、中文、emoji 或带重音的字母就不一样了。处理这些文本时用 mb_substr(),下文会讲到。

语法

substr(string $string, int $offset, ?int $length = null): string
  • $offset 是起始位置。0 是第一个字符。负数表示从末尾开始计算。
  • $length 是要取的字节数(在纯 ASCII 文本中,一个字节就是一个字符)。负数表示在末尾留下那么多个不取。null(或者省略)表示“取到末尾”。

负数的偏移量和长度:从末尾开始

负数的 $offset 从字符串末尾开始计算,所以 -1 是最后一个字符。负数的 $length 在距末尾那么多个字符的地方停下。

substr($s, 0, -1) 是去掉最后一个字符的常用写法,比如去掉循环留下的末尾逗号。

获取第一个或最后一个字符

对于单个字节,也可以直接用下标访问字符串。$s[0] 是第一个字符,从 PHP 7.1 开始,$s[-1] 是最后一个字符。

用下标访问不存在的位置会打印警告,而 substr() 只会返回空字符串。如果字符串可能为空,优先用 substr()。

超出范围:返回空字符串,而不是 false

如果 $offset 超出了字符串末尾,PHP 8 中 substr() 返回 ""。PHP 7 中它返回 false,所以检查 === false 的旧代码已经不再有效。

中文和日文文本:用 mb_substr

UTF-8 中假名和常用汉字各占 3 个字节(𠮷 这样的生僻字和 emoji 占 4 个)。substr() 按字节计数,所以 substr('こんにちは', 0, 3) 只返回 こ;如果长度没有落在字符边界上,就会把一个字符切成两半,得到乱码。mb_substr() 接收同样的参数,但按字符计数。

emoji 和 é 这样带重音的字母也是同样的道理。统计字符数用 mb_strlen();字节和字符的区别见 strlen()。

截断文本并加省略号

在列表或卡片里截短过长的标题,是 substr() 在实际项目中最常见的用法。用 mb_substr(),确保中文或日文标题不会在字符中间被切断,并且只在真的截短了内容时才加上 ...。

mb_strimwidth($text, 0, $width, '...') 按显示宽度做同样的事,一个全角的中日文字符算 2 列,一个拉丁字母算 1 列。它适合等宽排版。

用 substr_count 统计子串次数

substr_count($haystack, $needle) 返回 $needle 出现的次数。它区分大小写,不统计重叠的匹配。

substr 配合 strpos:取某个字符之前或之后的文本

把 substr() 和 strpos() 结合起来,就能在事先不知道位置的字符处截断,比如邮箱地址里的 @:

使用 strpos() 的结果之前,先确认它没有返回 false:如果字符不存在,false 会被悄悄当成 0,不会有任何警告,于是 substr('nobody', 0, $at) 返回 "",substr('nobody', $at + 1) 返回 "obody"。

常见问题

PHP 中怎么获取字符串的最后几个字符?

用负数偏移量:substr($s, -3) 返回最后 3 个字符。对于可能包含中文、日文或其他多字节字符的文本,用 mb_substr($s, -3)。

substr 和 mb_substr 有什么区别?

substr() 按字节计数,mb_substr() 按字符计数。在 UTF-8 中假名和常用汉字各占 3 个字节,所以 substr('日本語', 0, 2) 会把一个字符切成两半,而 mb_substr('日本語', 0, 2) 返回 "日本"。

起点超出字符串末尾时,substr 返回什么?

返回空字符串。从 PHP 8.0 开始,substr('abc', 5) 返回 "";PHP 7 中返回 false。

PHP 中怎么去掉字符串的最后一个字符?

substr($s, 0, -1) 返回除最后一个字节以外的所有内容。多字节文本用 mb_substr($s, 0, -1);如果只想去掉某个特定的末尾字符,用 rtrim($s, ',')。

PHP 中怎么统计子串出现的次数?

用 substr_count($haystack, $needle):substr_count('banana', 'an') 返回 2。它区分大小写,不统计重叠的匹配。

Coddy 编程语言插图

和 Coddy 一起学编程

开始