排除文件类型 .exe 和 .js 的正则表达式

21
我正在使用JQuery文件上传插件,为了给选项"accept files"提供值,我需要一个正则表达式来限制文件类型。我已经通过以下表达式限制了exe和js文件:
( \ . | /)(!exe | !js)$
但是这个表达式也限制了其他文件,然后我尝试添加pdf扩展名,如下所示:
(\. | /) (!exe |!js | pdf)$
使用上述正则表达式,它只接受pdf文件,而不接受exe和JS文件。现在我需要启用除exe和js之外的所有文件扩展名。将所有扩展名添加到表达式中会很困难。我们能否以与上面类似的格式在表达式中提到某些方式以接受其他文件类型?此正则表达式适用于JS。
谢谢,
Vinay
3个回答

29

这将排除字符串末尾的.js.exe,但允许任何其他内容:

/^[^.]+$|\.(?!(js|exe)$)([^.]+$)/

拆分如下:

  1. ^[^.]+$ 匹配不含有点的任意字符串
  2. \.(?!(js|exe)$)([^.]+$) 仅匹配在字符串末尾没有跟随 js 或者 exe 的点号。

以下是允许的:

  • something.js.notjs
  • somethingelse.exee
  • /something.js/foo

以下是不允许的:

  • jquery.js
  • outlook.exe

请注意: 排除特定文件扩展名并不能替代安全性,即使是JS和EXE文件也无法构成全面的黑名单。如果您排除某些扩展名的目的是为了保护您的服务器或用户,请考虑使用白名单扩展名以及在上传后对文件数据进行彻底验证。


感谢提供详细信息。正则表达式已经可以工作,但存在一些小问题。当我添加多个exe文件时,该工具不会为第二个exe文件显示验证错误。我需要查看插件JS是否存在任何问题。 - Vinay

2

您想使用(?!pattern)语法。同时,在说明要匹配的内容时,您没有说明应该匹配什么。所以这个应该可以解决问题:

(\.|\/)(?!exe|js).*$

这段话的意思是“匹配任何点号(.),只要它后面不跟着 'exe' 或 'js',然后匹配之后想要的任何内容。”

我在http://www.regexr.com/v1/测试了那个表达式,认为它按预期工作,但当我将其作为插件选项提供时,它无法正常工作,它接受所有文件类型。 我需要在前面添加'/'并在末尾添加'/i'以适当的方式给出它。 因此,我传递给该选项的最终值是/(.|/)(?!exe|js).*$/i,将这些内容添加到正则表达式中是否会有任何差异? - Vinay
1
这会对像 foo.jss/execution/files 这样的字符串返回一个错误的负值。 - eyelidlessness
你是对的,@eyelidlessness。我需要使用?!语法(?!(exe|js)$).*$。 - David Maddox

0

我不知道这个工作是否适用于您,但99%的情况下,以下模式将可帮助您排除exe或js扩展名。

/\.(exe|js)$/ig

下面的代码会在文件被列入黑名单时返回 TRUE。否则它会返回 FALSE。

var result = /\.(exe|js)$/ig.test(filename);

希望这能帮到你!


它的运作方式完全相反。它接受exe和js格式,但不接受任何其他格式。请问能否提供相反的条件?我认为对此进行否定条件将解决问题。 - Vinay
你可以使用 ! 符号将整个条件转换为否定条件。/\.(!exe|!js)$/ig - Jaykumar Patel
刚刚尝试了一下,仍然无法识别所有文件类型,包括exe和js。 - Vinay
一种简单的解决方案是使用 ! 来对 test() 进行 JavaScript 评估。var result = ! /\.(exe|js)$/ig.test(filename); 因为如果该模式以 .exe 或 .js 结尾,它将返回 true - Will B.

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