PHP正则表达式用于文件名

4
我让用户通过文本区域更改文件名,但现在我遇到了一个正则表达式问题。
对于Windows 7,我发现以下字符不允许出现在文件名中:
\ / : * ? < > |
但是我固执地、也许是明智地,选择将正则表达式最小化,只使用这些特殊字符:
- _ .
其他所有字符都必须被剔除。
有人能帮我解决这个正则表达式吗?
将 preg_replace 应用于除以下内容之外的所有内容: A-Za-z0-9 以及 - _ .
我仍然真的不太懂。

1
或者使用简单的 str_replace(); 函数将不需要的字符替换为空字符串,如下所示 '' - rsz
3
“[^A-Za-z0-9-_.]” 的意思是“任何不是以下字符的内容…” - Marc B
1
Marc的解决方案是你要找的。 - Ian Overton
1
我相信你错过了 " - Alvin Wong
1
实际上,如果您将 - 放在末尾或像他一样进行转义,则可以在 [] 中使用 -。 - Ian Overton
显示剩余4条评论
2个回答

16
preg_replace('/[^A-Za-z0-9 _ .-]/', '', $filename);

[]

是一个字符类,^表示否定它。因此,它可以匹配该组中除了这些字符之外的任何字符。
请注意,-在末尾,因为如果在其他地方使用,则会成为特殊的范围字符,例如0-9。

1
它应该是“.”吗?点表示任何字符。 - ESP32

4

您的问题已经基本确定了字符集。您只需要将其插入preg_replace()中即可开始。

试试这个:

$filename = preg_replace('/[^a-zA-Z0-9_.-]/', '', $filename);

在字符集的开头加上 ^ 符号,并将其包围在 [] 中,表示不匹配该列表中的字符。因此,该行可以解释为“替换非以下字符的字符”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接