如何使用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
相关产品推荐
相关产品推荐

