PHP 字符串截取:详解 substr、mb_substr 及其应用场景126


PHP 提供了多种方法来截取字符串,其中最常用的是 `substr()` 和 `mb_substr()` 函数。 虽然功能相似,但它们在处理多字节字符(例如中文、日文等)方面存在显著差异,选择哪一个取决于你的项目需求和字符编码。

本文将深入探讨 `substr()` 和 `mb_substr()` 函数的用法,并通过丰富的示例代码,展示它们在不同场景下的应用,帮助你选择最合适的字符串截取方法,并避免潜在的编码问题。

`substr()` 函数:单字节字符截取

substr(string $string, int $start [, int $length = NULL ]): string

`substr()` 函数是 PHP 中最基本的字符串截取函数,它从指定的起始位置 `$start` 开始,截取指定长度 `$length` 的子字符串。如果省略 `$length` 参数,则会截取从 `$start` 位置到字符串末尾的子串。

需要注意的是,`substr()` 函数是基于字节的,这意味着它处理每个字符都当做一个字节。对于单字节字符集(例如 ASCII),这没有问题。但是,对于多字节字符集(例如 UTF-8),它可能会导致截取结果出现乱码,因为一个汉字可能占用多个字节。

示例:```php
$string = "Hello, world!";
$substring = substr($string, 7, 5); // 从第 7 个字符开始截取 5 个字符
echo $substring; // 输出: world
```
```php
$string = "你好,世界!"; // UTF-8 编码
$substring = substr($string, 3, 3); // 错误的截取方式,可能出现乱码
echo $substring; // 输出结果可能不正确
```

`mb_substr()` 函数:多字节字符安全截取

mb_substr(string $string, int $start [, int $length = NULL [, string $encoding = mb_internal_encoding() ]]): string

`mb_substr()` 函数是 `substr()` 函数的多字节字符安全版本。它可以正确处理多字节字符,避免出现乱码。 `$encoding` 参数指定字符编码,如果不指定,则使用 `mb_internal_encoding()` 函数返回的内部字符编码。

建议在处理包含多字节字符的字符串时,始终使用 `mb_substr()` 函数。

示例:```php
$string = "你好,世界!";
$substring = mb_substr($string, 3, 3, 'UTF-8'); // 正确的截取方式
echo $substring; // 输出: 世界!
```
```php
//设置内部编码,确保一致性
mb_internal_encoding("UTF-8");
$string = "你好,世界!";
$substring = mb_substr($string, 3, 3); // 不需要指定编码,因为已经设置了内部编码
echo $substring; // 输出: 世界!
```

负数索引

`substr()` 和 `mb_substr()` 都支持负数索引。负数索引表示从字符串末尾开始计数。-1 表示最后一个字符,-2 表示倒数第二个字符,以此类推。

示例:```php
$string = "Hello, world!";
$substring = substr($string, -6); // 从倒数第 6 个字符开始截取到结尾
echo $substring; // 输出: world!
$string = "你好,世界!";
$substring = mb_substr($string, -3, 3, 'UTF-8'); // 从倒数第 3 个字符开始截取 3 个字符
echo $substring; // 输出: 界!
```

截取指定字符后的字符串

有时我们需要截取指定字符后的字符串,这需要结合字符串查找函数 `strpos()` 或 `mb_strpos()` 来实现。

示例:```php
$string = "This is a test string.";
$keyword = "test";
$position = strpos($string, $keyword);
if ($position !== false) {
$substring = substr($string, $position + strlen($keyword));
echo $substring; // 输出: string.
}
$string = "这是一个测试字符串。";
$keyword = "测试";
$position = mb_strpos($string, $keyword, 0, 'UTF-8');
if ($position !== false) {
$substring = mb_substr($string, $position + mb_strlen($keyword, 'UTF-8'), null, 'UTF-8');
echo $substring; // 输出: 字符串。
}
```

截取指定字符之间的字符串

截取两个特定字符之间的字符串,需要使用字符串查找函数找到起始位置和结束位置,然后使用 `substr()` 或 `mb_substr()` 进行截取。

示例(简化版,需处理异常情况):```php
$string = "Start[content]End";
$start = '[';
$end = ']';
$startIndex = strpos($string, $start);
$endIndex = strpos($string, $end, $startIndex + 1);
if ($startIndex !== false && $endIndex !== false) {
$substring = substr($string, $startIndex + 1, $endIndex - $startIndex - 1);
echo $substring; // 输出: content
}
```

实际应用中,需要添加更完善的错误处理,例如检查起始字符和结束字符是否存在,防止出现异常。

总而言之,选择 `substr()` 还是 `mb_substr()` 取决于你的字符串编码和字符类型。对于多字节字符集,强烈建议使用 `mb_substr()` 来确保正确性和避免乱码。 理解这些函数的特性并结合其他字符串操作函数,可以灵活地处理各种字符串截取需求。

2025-05-18


上一篇:PHP文件逆向工程与安全加固:应对OD破解

下一篇:PHP中模拟List数组及其实现方法