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

PHP PCRE正则匹配扩展名后的空格实现多文件名分割问题

解决老旧数据库文件名分割问题

首先得给你点个赞,已经摸到问题的核心了——PCRE的正向预查(lookbehind)确实不支持可变长度的匹配,(?<=[\w]+)这种写法肯定会报错,因为+意味着长度不固定。不过我们可以换个思路,用多分支固定长度的lookbehind来绕过这个限制,同时更精准地匹配分隔文件名的空格。

核心思路

你的需求是区分「文件名内部的空格」和「分隔不同文件名的空格」,从例子来看,分隔空格都出现在带后缀的文件名后面(比如.mp3、.mid、.rm)。所以我们只需要匹配紧跟在2或3字符后缀(比如.rm、.mp3)之后的空格,就能准确分割出每个完整的文件名。

可行的正则表达式

利用PCRE支持多分支固定长度lookbehind的特性,我们可以写出这样的正则:

/(?<=\.[\w]{2}|\.[\w]{3})\s/
  • (?<=\.[\w]{2}):匹配前面是.xx(2字符后缀)的位置
  • (?<=\.[\w]{3}):匹配前面是.xxx(3字符后缀)的位置
  • \s:匹配分隔用的空格

实际代码示例

把这个正则用到preg_split()里,就能得到你想要的结果:

$filenameStr = "Filename.mp3 file anem.mid fi le nam e.rm";
$filenames = preg_split('/(?<=\.[\w]{2}|\.[\w]{3})\s/', $filenameStr);

// 输出结果
print_r($filenames);

运行后会得到:

Array
(
    [0] => Filename.mp3
    [1] => file anem.mid
    [2] => fi le nam e.rm
)

扩展调整

如果你的数据库里还有更长的后缀(比如.html),只需要在lookbehind里加对应的分支就行,比如:

/(?<=\.[\w]{2}|\.[\w]{3}|\.[\w]{4})\s/

这样就能覆盖更多后缀场景啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:27:12