应使用 parse_url() 提取 path 后用 basename() 获取最后一段,安全且语义清晰;若必须字符串操作,需先用 strtok() 清理 ?#,再结合 strrpos() 和 substr();避免直接对完整 URL 用 substr() 或 explode()。

直接用 substr() 截取 URL 最后一段不可靠,因为它不识别路径分隔符逻辑,容易切在协议、查询参数或锚点里。正确做法是先解析结构,再提取路径段。
推荐:用 parse_url() 提取 path,再用 basename() 获取最后一段
这是最安全、语义最清晰的方式,专为 URL 设计:
-
parse_url()解析出完整路径(不含查询参数和锚点) -
basename()直接获取路径末尾的文件名或目录名
示例:
代码可直接运行$url = "https://api.example.com/v2/users/123?format=json#top";<br>$path = parse_url($url, PHP_URL_PATH); // → "/v2/users/123"<br>$last = basename($path); // → "123"
立即学习“PHP免费学习笔记(深入)”;
如果必须用字符串操作:结合 strrpos() 和 substr()
适用于无法使用 parse_url() 的极简场景(如纯路径字符串、已知无查询参数):
- 用
strrpos($path, '/')找到最后一个/的位置 - 用
substr($path, $pos + 1)取其后全部内容
注意:输入必须是干净路径(如 /api/v1/posts),不能含 ? 或 #,否则需先清理:
$clean = strtok($url, '?#'); // 切掉查询参数和锚点<br>$path = parse_url($clean, PHP_URL_PATH) ?: $clean;<br>$pos = strrpos($path, '/');<br>$last = $pos !== false ? substr($path, $pos + 1) : $path;
中文或特殊字符路径要额外注意编码
若路径含中文、emoji 或非 ASCII 字符(如 /文章/详情),basename() 在 PHP 7.4+ 默认支持 UTF-8,但需确保:
- 脚本文件保存为 UTF-8 无 BOM
- Web 服务器或 CLI 环境的 locale 支持 UTF-8(如
setlocale(LC_ALL, 'en_US.UTF-8')) - 避免混用
substr()和strlen()—— 它们按字节操作,会截断中文导致乱码
不建议的写法
以下方式容易出错,应避免:
-
explode('/', $url)[count(explode('/', $url)) - 1]—— 会把https://里的/也算进去 -
substr($url, strrpos($url, '/') + 1)—— 若 URL 含?k=v,结果可能是123?format=json - 未清理就对带锚点的 URL 使用
basename(),可能返回空或错误片段



















