PHP 8.0 的 str_ends_with() 是原生函数,用于判断字符串是否以指定子串结尾,支持单个或多个候选结尾、自动处理多字节字符(需 mbstring)、空字符串结尾恒为 true,但区分大小写。

PHP 8.0 引入了 str_ends_with() 这个原生函数,用来判断字符串是否以指定子串结尾,比手动用 substr() 或 mb_substr() 更简洁安全。它返回布尔值,不区分大小写(这点要注意),且自动处理多字节字符(如中文、emoji)——但前提是 PHP 编译时启用了 mbstring 扩展(绝大多数生产环境都已启用)。
基本用法:两个参数,缺一不可
函数签名是:str_ends_with(string $haystack, string|array $needle): bool。第一个参数是待检测的主字符串,第二个是结尾目标(支持单个字符串或字符串数组)。
- 正确写法:
str_ends_with('hello world', 'world')→true - 支持多个候选结尾:
str_ends_with('report.pdf', ['.pdf', '.txt'])→true - 空字符串结尾恒为
true:str_ends_with('abc', '')→true(符合 POSIX 兼容逻辑) - 如果
$needle是数组,只要有一个匹配就返回true
常见错误:大小写和编码陷阱
该函数默认**区分大小写**。比如 str_ends_with('Image.JPG', '.jpg') 返回 false。需要忽略大小写时,不能直接改函数,而应先统一转小写:
- 推荐:
str_ends_with(strtolower($filename), strtolower('.jpg')) - 不建议用
mb_strtolower()单独处理(除非明确需多字节安全转换,且已确认mbstring可用) - 若字符串含 emoji 或中文,确保源码文件保存为 UTF-8 且未被意外转码,否则可能因字节截断导致误判
替代方案对比:什么情况下不该用它?
虽然方便,但不是万能。以下情况建议换方式:
立即学习“PHP免费学习笔记(深入)”;
- 需同时检查开头和结尾(如验证文件路径格式),用
str_starts_with()+str_ends_with()组合更清晰 - 要提取结尾部分(不只是判断),还是用
substr($s, -strlen($end)) === $end或正则更灵活 - 在 PHP if (!function_exists('str_ends_with')) { function str_ends_with($s, $end) { return is_array($end) ? (bool)array_filter($end, fn($e) => substr($s, -strlen($e)) === $e) : substr($s, -strlen($end)) === $end; } }
实战小技巧:结合类型声明和空值防护
实际项目中,变量可能为 null 或非字符串,直接传入会触发警告。建议封装一层:
function safe_ends_with(?string $s, string $end): bool { return is_string($s) && str_ends_with($s, $end); }- 配合属性类型(PHP 7.4+)或参数解构使用,减少运行时错误
- 验证上传文件扩展名时,优先用
pathinfo($file, PATHINFO_EXTENSION)再比对,比单纯依赖结尾更可靠(防伪装文件名)



















