如何过滤上传文件名,仅保留罗马字母(含重音)及合法符号?
文件名过滤解决方案(保留拉丁字母含重音+合法符号)
可以用PHP的preg_replace结合Unicode正则属性来实现,直接匹配并移除所有非允许的字符:
function sanitizeUploadFilename($filename) { // 先移除首尾空格 $filename = trim($filename); // 正则规则:保留所有拉丁系字母(含重音)、数字,以及._-这类常见合法符号 // \p{Latin} 匹配Unicode中所有拉丁字母(覆盖波兰语、法语、西班牙语等带重音的罗马字母) // u修饰符确保正则能正确处理Unicode字符 $cleanFilename = preg_replace('/[^\p{Latin}0-9._-]/u', '', $filename); return $cleanFilename; }
说明:
\p{Latin}是Unicode字符属性,会匹配所有罗马字母及其重音变体(比如波兰语的ą、ć,法语的é,德语的ü等),完美覆盖你需要保留的带重音罗马字母。- 正则中的
0-9._-是允许的额外字符,你可以根据需求调整(比如要允许@或&,直接加到集合里即可,变成[^\p{Latin}0-9._-@&])。 u修饰符必须加上,否则无法正确识别中文、阿拉伯文这类多字节Unicode字符。
之前用str_replace无法实现是因为它只能针对具体字符做替换,没法批量匹配“非拉丁字母”这类字符集合,正则的字符排除匹配刚好解决这个问题。
内容的提问来源于stack exchange,提问作者mitebu
相关产品推荐
相关产品推荐

