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
相关产品推荐
相关产品推荐

