preg_replace没有返回任何内容的问题

时间:2017-04-09 19:20:47

标签: regex

我正在对文件的名称进行一些检查,但即使我在regex101.com上测试时我的正则表达式有效,一旦我将它放在真实环境中,它总是不会返回任何内容......

我有一个文件名" abc123.jpg"存储在$ _FILES ["图片"] ["名称"]

如果我这样做:

str_replace('a','',$_FILES["picture"]["name"])

我得到了' bc123.jpg' 如果我这样做:

preg_replace('a','',$_FILES["picture"]["name"])

我得到'' (无)。

这怎么可能? 我错过了什么?

最终我的正则表达式是:

/[^\w\.\-]/g

删除除下划线,短划线和点之外的所有非字母数字字符(在文件类型扩展名之前需要)

1 个答案:

答案 0 :(得分:1)

您忘记使用regex delimiters。我建议你用

$s = preg_replace('~[^\w.-]+~', '', $s);
                   ^        ^

请参阅regex demo。在这里,我使用~作为正则表达式分隔符。

请注意,字符类末尾的-被视为连字符,不必进行转义。字符类中的.始终被视为文字点,也不需要转义它。由于您要删除这些符号,最好在连续的块中删除它们,因此,我建议在字符类之后添加+量词,以匹配1个或多个匹配项。

请注意,PHP正则表达式不支持/g修饰符,默认情况下preg_replace会替换所有非重叠的事件。