You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PHP的preg_replace函数智能去除字符串中的文件夹名与扩展名?

用preg_replace灵活去除路径前缀和文件扩展名

没问题!你的需求很明确——不管前面是什么文件夹(带/的)、后面是什么扩展名(带.的),都要只留下中间的文件名。原来的str_replace只能处理固定字符串,确实不够灵活,用正则表达式一次就能搞定。

直接上解决方案:

$sidebar = 'sidebarCond/none.php';
// 一次性移除路径前缀和文件扩展名
$sidebar = preg_replace('#^.*/|\..*$#', '', $sidebar);
echo $sidebar; // 输出: none

拆解一下这个正则表达式

我用#作为正则的分隔符(避免和路径里的/冲突,比用/更省心),里面的规则分成两部分,用|(或)连接:

  • ^.*/:匹配从字符串开头到最后一个/的所有内容(包括/本身)
    • ^ 锚定字符串的起始位置
    • .* 匹配任意字符(除换行)任意次数,这里会一直匹配到最后一个/
  • \..*$:匹配从最后一个.到字符串结尾的所有内容(包括.本身)
    • \. 转义后的点(因为正则里的.是通配符,必须转义才能匹配实际的点)
    • .* 匹配任意字符任意次数
    • $ 锚定字符串的结束位置

测试各种场景都能搞定

这个正则能处理你能想到的大部分情况:

  • 输入folder-name/page.html → 输出page
  • 输入deep/path/with/many/folders/test.txt → 输出test
  • 输入justfilename.js → 输出justfilename(没有路径前缀也能正常工作)
  • 输入/root/file.md → 输出file(开头带/也没问题)

进阶:如果文件名本身包含点怎么办?

比如你的文件是my.report.v1.pdf,如果想保留文件名里的点,只去掉最后的.pdf,可以把正则改成:

$sidebar = preg_replace('#^.*/|\.[^.]*$#', '', $sidebar);

这里把\..*$改成了\.[^.]*$,意思是:匹配最后一个.后面不包含点的内容到结尾,这样my.report.v1.pdf会变成my.report.v1,而不是把所有点后面的内容都删掉。

这样是不是比一堆str_replace灵活多啦😉

内容的提问来源于stack exchange,提问作者Naf Rifat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:35:11