
本文介绍使用 stripos() 和 substr() 组合定位并截取字符串中第二次出现某字符之后的全部内容,适用于动态长度与任意下划线数量的场景,代码简洁高效且不依赖正则。
本文介绍使用 `stripos()` 和 `substr()` 组合定位并截取字符串中第二次出现某字符之后的全部内容,适用于动态长度与任意下划线数量的场景,代码简洁高效且不依赖正则。
在 PHP 开发中,常需从分隔符(如下划线 _)结构化字符串中提取特定段落。例如,给定字符串 $foo = 'this_is_a_string',目标是获取第二次下划线之后的所有字符(即 "a_string"),而非依赖固定位置或正则表达式。
核心思路是:两次调用 stripos() 定位前两个 _ 的位置,再用 substr() 从第二个 _ 的下一个字符开始截取至末尾。
以下是推荐实现:
<?php $foo = 'this_is_a_string';
// 第一次查找 '_' 的位置
$first = stripos($foo, '_');
if ($first === false) {
echo "未找到第一个 '_',无法继续";
exit;
}
// 第二次查找:从 first+1 位置起向后搜索下一个 '_'
$second = stripos($foo, '_', $first + 1);
if ($second === false) {
echo "未找到第二个 '_',返回空字符串";
$result = '';
} else {
// 从第二个 '_' 后一位开始截取(+1 是关键)
$result = substr($foo, $second + 1);
}
var_dump($result); // string(9) "a_string"
?>
✅ 优势说明:
- stripos() 不区分大小写,若需严格区分,可改用 strpos();
- 避免正则开销,性能更优,尤其适合高频调用;
- 支持任意长度字符串及任意数量 _(如 'a_b_c_d_e' → 'c_d_e');
- 显式错误处理,增强健壮性(如缺失第二个 _ 时安全降级)。
⚠️ 注意事项:
- 若字符串中 _ 少于 2 个,$second 将为 false,直接用于 substr() 会触发警告(PHP 8+ 报 TypeError),因此务必先校验;
- substr($str, -1) 等负偏移不适用此场景——我们始终需要正向绝对偏移;
- 如需“第二次与第三次之间”的内容,应改用 explode() 或正则 preg_match(),本方案专注“第二次之后至结尾”。
该方法简洁、可读性强,是处理层级化命名(如 module_controller_action)时提取后缀部分的实用技巧。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











