如何让preg_replace对文件路径的每个目录前缀执行替换?
解决路径段批量替换问题
哦,这个问题我太懂了!你之前用的正则因为贪婪匹配的特性,把所有前面的路径段都当成一个整体匹配了,所以只替换了一次。咱们来一步步搞定它:
问题根源
你写的正则(.+\/)+里,.+是贪婪匹配模式——它会尽可能多地抓取字符,直到碰到最后一个斜杠。所以整个customer-service/tweep/cs/gsergsergrs/被当成了一个匹配项,自然只替换成了一个---/。
正确的解决方案
我们需要匹配每个单独的路径段+斜杠,也就是用[^\/]+\/这个正则表达式:
[^\/]+:精准匹配一个或多个「不是斜杠」的字符(也就是单个路径段)\/:匹配路径段后面跟着的斜杠
这样每个xxx/都会被单独识别,然后替换成---/。
代码示例
$string = "customer-service/tweep/cs/gsergsergrs/2017-20190Course-Schedule.pdf"; $result = preg_replace("/[^\/]+\//", "---/", $string); echo $result;
运行这段代码后,你会得到想要的结果:
---/---/---/---/2017-20190Course-Schedule.pdf
额外说明
这个正则还能兼容一些特殊情况:
- 如果路径开头有斜杠(比如
/customer-service/tweep/file.pdf),开头的斜杠不会被匹配,结果会是/---/---/file.pdf - 如果路径结尾有斜杠(比如
customer-service/tweep/cs/),所有路径段都会被替换,结果是---/---/---/
内容的提问来源于stack exchange,提问作者Ice76
相关产品推荐
相关产品推荐

