允许空格,破折号和普通字符的Preg匹配

时间:2012-08-28 06:17:28

标签: php regex

我非常抱歉问这个! Regex有很多资源,但我使用它并理解文档非常糟糕。

这有点紧急。

我拥有一个用户可以上传文件的网站。 Recenlty,用户开始上传大量名称与此类似的文件:

1538æŽä»£æ²«&曲婉婷对唱《我的歌声里》追忆罗纳尔多.flv

他正在做一些非常时髦的事情。

我一直在尝试构建一个能正常工作的正则表达式,并阻止用户上传带有奇怪名称的文件。我从另一个问题中找到了这个:

function isValid($str) {
return !preg_match('/[^A-Za-z0-9.#\\-$]/', $str);
}

问题是,这有点太严格了。它不允许空格。

我需要编辑该功能以允许spacesdashes$ signssingle quotes。但不仅如此。

我该怎么做?

非常感谢您的帮助!我为我可怕的正则表达式知识道歉。

1 个答案:

答案 0 :(得分:1)

要在PHP中将单引号添加到字符串(任何字符串),您需要通过在前面添加斜杠来“转义”它:

'\''
 ^- slash

这是必要的,因为否则PHP无法理解字符串定义的位置。

$-符号在正则表达式中的字符类中具有特殊含义,因此它们也需要某种转义。这又是一个\斜杠,但是要在PHP单引号字符串中写一个斜杠,它还需要另一个斜杠:

'\\'

因此,为了构建正则表达式,所有这些都需要集合在一起(如果你将短划线移动到字符类的末尾它没有特殊含义):

'/[^A-Za-z0-9.# \\$\'-]/'
               ^ ^ ^- slash for the single quote
               | `- slashed slash for the $ sign
               `- space

我没有对此进行测试,但正如您所看到的,它可能会变得有点复杂,因为首先有一些PHP字符串的转义,然后有一些转义为正则表达式模式。