PHP截取字符串几种方式_多种字符串截取方案对比
在PHP开发过程中,截取字符串是非常常见的操作,比如展示文章摘要、处理用户输入数据、格式化显示内容等场景都会用到。PHP本身提供了多种字符串截取的相关函数,不同函数的适用场景和特性存在差异,下面我们就逐一介绍常见的字符串截取方式,并对它们的特点进行对比。
一、使用substr函数截取字符串
substr是PHP中最基础的字符串截取函数,它的核心逻辑是按照指定的起始位置和长度,从原字符串中截取对应部分。这个函数对纯英文字符串的处理非常直接,但是遇到多字节字符(比如中文、日文等)时,很容易出现乱码问题,因为中文在UTF-8编码下通常占3个字节,直接按字节截取就会截断字符。
<?php // 截取纯英文字符串 $englishStr = "Hello World"; // 从索引0开始,截取5个字符 $sub1 = substr($englishStr, 0, 5); echo $sub1; // 输出 Hello // 截取中文字符串(会出现乱码) $chineseStr = "你好世界,欢迎学习PHP"; // 从索引0开始,截取3个字节,中文UTF-8下单个字符占3字节,这里只会截取到第一个字的一半 $sub2 = substr($chineseStr, 0, 3); echo $sub2; // 输出乱码,无法正常显示 ?>
二、使用mb_substr函数截取多字节字符串
mb_substr是mbstring扩展提供的多字节字符串截取函数,它的使用方式和substr类似,但是会按照指定的字符集来计算字符长度,而不是按字节长度,因此非常适合处理包含中文的多字节字符串,不会造成字符截断乱码的问题。
<?php // 截取中文字符串,指定字符集为UTF-8 $chineseStr = "你好世界,欢迎学习PHP"; // 从索引0开始,截取2个字符,字符集为UTF-8 $sub = mb_substr($chineseStr, 0, 2, "UTF-8"); echo $sub; // 输出 你好 // 截取混合字符串 $mixStr = "Hello你好PHP"; $sub2 = mb_substr($mixStr, 5, 2, "UTF-8"); echo $sub2; // 输出 你好 ?>
三、使用explode配合array_slice截取字符串
如果需要按照特定的分隔符来截取字符串,比如截取邮箱的用户名部分、截取URL的路径部分,那么可以先使用explode函数将原字符串按分隔符拆分成数组,再配合array_slice函数取数组的指定部分,最后用implode重新拼接成字符串。这种方式适合有明确分隔规则的字符串截取场景。
<?php
// 截取邮箱的用户名部分
$email = "testuser@ipipp.com";
// 按@符号拆分字符串为数组
$arr = explode("@", $email);
// 取数组的第一个元素,也就是用户名部分
$username = $arr[0];
echo $username; // 输出 testuser
// 截取URL的路径部分第一段
$url = "https://ipipp.com/article/php-string-cut";
// 按/拆分字符串
$pathArr = explode("/", $url);
// 取路径部分,忽略前面的协议和域名部分
$slice = array_slice($pathArr, 3);
$path = implode("/", $slice);
echo $path; // 输出 article/php-string-cut
?>四、使用正则表达式截取字符串
当截取规则比较复杂,比如需要匹配特定模式的字符串片段时,使用正则表达式配合preg_match或者preg_replace函数会更加灵活。比如需要从一段文本中提取所有的数字、提取特定格式的字符串等场景,正则截取可以精准匹配目标内容。
<?php
$content = "订单号:123456,总金额:789元,联系电话:13800138000";
// 匹配11位手机号
preg_match("/1[3-9]\d{9}/", $content, $match);
if (!empty($match)) {
echo "提取到的手机号:" . $match[0]; // 输出 提取到的手机号:13800138000
}
// 提取所有数字
preg_match_all("/\d+/", $content, $numMatch);
print_r($numMatch[0]);
// 输出 Array ( [0] => 123456 [1] => 789 [2] => 13800138000 )
?>五、多种方式对比总结
为了更清晰地了解不同截取方式的适用场景,我们可以参考下面的对比表格:
| 截取方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| substr函数 | 纯英文、无多字节字符的字符串截取 | 语法简单,执行效率高,无需额外扩展 | 无法正确处理多字节字符,容易出现乱码 |
| mb_substr函数 | 包含中文、日文等多字节字符的字符串截取 | 支持多字符集,不会截断多字节字符,无乱码问题 | 需要mbstring扩展支持,纯英文场景下效率略低于substr |
| explode+array_slice | 按固定分隔符拆分截取字符串的场景 | 逻辑清晰,适合有明确分隔规则的字符串处理 | 只能按固定分隔符处理,不适合无规则的截取需求 |
| 正则表达式截取 | 复杂规则、模式匹配的字符串截取场景 | 灵活性极高,可以匹配各种复杂规则的内容 | 正则语法学习成本较高,复杂正则的执行效率相对较低 |
在实际开发中,我们可以根据具体的字符串类型和处理需求,选择最合适的截取方式。如果是简单的纯英文截取优先用substr,涉及中文等多字节字符用mb_substr,按分隔符处理用explode配合数组函数,复杂规则匹配则用正则表达式,这样既能保证功能正确,也能尽可能提升代码执行效率。