str_starts_with()和str_ends_with()是php 8.0+原生函数,语义清晰、性能优、区分大小写,支持空字符串,但需确保php≥8.0且注意多字节字符串兼容性。

用 str_starts_with() 和 str_ends_with() 最省心
PHP 8.0+ 原生支持这两个函数,语义清晰、性能好、不依赖扩展。直接传入字符串和前缀/后缀即可,返回 true 或 false。
常见错误是 PHP 版本低于 8.0 却照抄写法,会报 Call to undefined function str_starts_with()。
- 必须确保运行环境是 PHP 8.0 及以上(可用
php -v确认) - 两个函数都区分大小写;如需忽略大小写,得先用
strtolower()统一转换 - 空字符串
''是合法参数:str_starts_with('abc', '')恒为true
PHP
不能用原生函数时,最稳妥的是用 substr() + strlen() 手动比对,避免正则或 strpos() 的边界陷阱。
比如用 strpos($str, $prefix) === 0 判断开头,看似简洁,但当 $prefix = '0' 且 $str = '0123' 时没问题;一旦 $prefix = '' 就永远返回 0,逻辑错乱。
- 判断开头:
strlen($str) >= strlen($prefix) && substr($str, 0, strlen($prefix)) === $prefix - 判断结尾:
strlen($str) >= strlen($suffix) && substr($str, -strlen($suffix)) === $suffix - 封装成函数时注意检查参数类型,避免传入
null或数组触发警告
别用 preg_match() 做简单开头结尾判断
正则虽然灵活,但对纯前后缀匹配属于杀鸡用牛刀:性能差、可读性低、易引入转义错误。
例如写 preg_match('/^https?:\/\//', $url) 看似合理,但实际中常漏掉分隔符转义(/ 在模式里要写成 \/),或忘记加 === 1 判断(preg_match 匹配失败返回 0,出错才返回 false)。
- 只有需要通配、可选字符、或动态模式时才考虑正则
- 纯字面量匹配,
str_starts_with()或substr()方案更安全、更快 - 若坚持用正则,至少加上
PREG_NO_ERROR检查是否编译失败
注意多字节字符串(如中文、emoji)
上面所有方案默认按字节操作,遇到 UTF-8 中文或 emoji 时可能截断字符,导致误判。
例如 substr('你好', 0, 2) 可能只取到半个汉字(UTF-8 下一个中文占 3 字节),结果不是预期的 '你好' 而是乱码片段。
- 涉及中文、日文、emoji 等场景,必须改用
mb_substr()和mb_strlen() - 记得指定编码:
mb_substr($str, 0, mb_strlen($prefix, 'UTF-8'), 'UTF-8') -
str_starts_with()在 PHP 8.0+ 中已内部支持 UTF-8 安全,无需额外处理
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











