substr 是字符串截取函数,核心作用是从原始字符串里面,按照起始位置和截取长度,提取出一段子字符串,它在 JavaScript PHP C++ 等多种编程语言里面都存在,但是不同语言的参数规则下标是否从 0 开始 负索引支持情况有差异,很多开发者踩坑就是没有区分不同语言版本 substr 的实现,把 A 语言的用法直接套到 B 语言,造成截取结果错位。出现这个问题的根本原因,substr 属于通用名称函数,并不是统一标准内置函数,各个语言设计者可以自定义参数逻辑,尤其是 JS 里面 substr 已经被标记为遗留函数,官方推荐替换成 substring,但是旧项目代码依旧大量使用,所以学习的时候既要掌握 substr 本身用法,也要和 substring slice 做横向对比,避免混淆。下面分层讲解语法 参数规则,再做横向对比,附带实操步骤。
一 substr 基础语法
通用语法格式
字符串.substr (起始下标,截取长度)
清单
1 第一个参数 start 起始下标,代表从哪个位置开始截取字符
2 第二个参数 length 可选,代表一共截取多少个字符,如果省略这个参数,就一直截取到字符串末尾
3 返回值 新的子字符串,原字符串本身不会被修改,属于非破坏性操作
4 注意区分 第二个参数是长度,不是结束下标,这是 substr 最核心特征,也是和 substring 最大差别
二 下标规则重点说明
清单
1 部分语言下标从 0 开始,也就是第一个字符位置是 0,例如 JavaScript
2 部分语言支持负起始下标,负数代表从字符串末尾反向计数,比如 PHP JS,start 为负,代表从倒数第几个字符开始
3 如果起始下标超出字符串总长度,函数返回空字符串
4 如果传入的长度是负数,不同语言表现不一样,JS 里面会直接转为 0,返回空串,PHP 会有另外一套处理逻辑
三 示例演示 JS 环境
原始字符串 str = "abcdef"
str.substr (1,3) 从下标 1 开始,截取 3 个字符,结果是 bcd
str.substr (2) 省略长度,从下标 2 一直截取到末尾,结果是 cdef
str.substr (-2,2) 负索引,倒数第二个位置开始截取 2 位,结果是 ef
四 横向对比 substr substring slice
| 函数 | 第一个参数 | 第二个参数 | 负索引 | 状态 |
|---|---|---|---|---|
| substr | 起始位置 | 截取长度 | JS 支持 | JS 属于遗留函数不推荐新项目 |
| substring | 起始下标 | 结束下标 | 不支持负数,负数自动转 0 | 标准推荐函数 |
| slice | 起始下标 | 结束下标 | 支持负索引 | 标准推荐函数,灵活度最高 |
五 实操使用步骤
第一步 确认当前编程语言,先查文档,确认 substr 下标起点,是否支持负索引,长度负数的处理方式
第二步 明确业务需求,如果你需要按长度截取,优先考虑 substr,如果需要按结束下标截取,选择 substring 或者 slice
第三步 新项目开发,JS 环境尽量不要继续使用 substr,替换成 slice,规避未来标准废弃风险
第四步 调试的时候打印原始字符串下标,核对起始位置,排查偏移错误
按照这套流程,就可以正确调用 substr,同时分清它和同类函数的差异,减少跨语言开发 bug。
【常见问题】
问题 1 JS 里面 substr 为什么不推荐继续使用
回答 1 JS 的 substr 属于遗留函数,它的参数设计和标准字符串函数不一致,官方推荐新项目改用 slice,但是旧代码里面 substr 仍然可以正常运行,维护老项目的时候依然要读懂 substr。
问题 2 substr 和 substring 第二个参数有什么本质差别
回答 2 substr 第二个参数代表截取长度,substring 第二个参数代表结束下标,这是 substr 和 substring 最核心区别,写代码的时候如果搞错这个参数含义,截取出来的字符串就会出错。
问题 3 substr 支持负起始下标是不是所有语言都一样
回答 3 不是,JS 和 PHP 的 substr 支持负起始下标,但是其他部分语言的 substr 不支持负数,跨语言移植代码的时候,不能默认 substr 全部支持负索引。
问题 4 substr 执行之后原字符串会被修改吗
回答 4 substr 属于纯读取截取,调用 substr 之后原字符串保持不变,只会返回新的子字符串,这点和 slice substring 特性一致,不会改动原始字符串。
【免责申明】
本文为编程函数教学讲解,不同编程语言版本更新之后 substr 行为可能调整,具体参数与废弃状态请以对应语言官方文档为准,本文仅用于学习参考,不替代官方技术手册。


