我越来越意识到浏览器会解释正则表达式的方式存在重大差异 例如,一位同事编写了这个正则表达式,以验证正在上传的文件是否具有PDF扩展名:
^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.pdf)$
这适用于Internet Explorer和Google Chrome,但不适用于Firefox。即使对于实际的PDF,测试总是失败。所以我决定额外的东西是无关紧要的,并简化为:
^.+\.pdf$
现在它在Firefox中运行良好,并且继续在IE和Chrome中工作 这是asp中特有的怪癖:FileUpload和RegularExpressionValidator控件,还是仅仅是因为不同的浏览器以不同的方式支持正则表达式?无论哪种方式,你遇到的后者有哪些?
答案 0 :(得分:4)
关于实际问题:原始正则表达式要求值以驱动器号或UNC设备名开头。 Firefox很可能根本不包含文件名。另请注意,如果您有任何跨平台的意图,那么无论使用何种浏览器,该正则表达式都将在任何非Windows系统上失败,因为它们不使用驱动器号或UNC路径。你简化的正则表达式(“接受任何东西,只要它以.pdf结尾”)就像你要获得的文件名检查一样好。
然而,Jonathan对原始问题的评论不能过分强调。从来没有永远信任文件名作为确定其内容的适当方法。或者MIME类型,就此而言。与您的Web服务器(可能甚至不是浏览器)通信的客户端软件可能会欺骗您,除非您进行验证,否则您将永远不会知道。在这种情况下,这意味着将接收到的文件提供给一些理解PDF格式的代码,并让代码告诉您它是否是有效的PDF。检查文件名可能有助于防止人们尝试提交明显不正确的文件,但这不足以测试收到的文件。
(我知道您可能知道需要进行额外验证,但下一个遇到类似情况但发现您的问题的人可能不会。)
答案 1 :(得分:3)
据我所知,firefox不允许你拥有上传的完整路径。在这种情况下,对正则表达式的解释似乎无关紧要。我还没有看到正则表达式执行中现代浏览器之间的任何区别。
答案 2 :(得分:1)
如果您使用的是javascript,请不要使用斜杠包含正则表达式,这会导致Firefox出错。
尝试var regex = /^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.pdf)$/;
答案 3 :(得分:1)
正如Dave所说,Firefox不提供路径,只提供文件名。正如他所提到的,它没有考虑操作系统之间的差异。我认为你能做的最好的检查是检查文件名是否以PDF结尾。此外,这不能确保它是有效的PDF,只是文件名以PDF结尾。根据您的需要,您可能需要通过检查内容来验证它实际上是PDF。
答案 4 :(得分:0)
我没有注意到浏览器之间在模式语法方面的差异。但是,我注意到C#和Javascript之间存在差异,因为C#的实现允许返回引用而Javascript的实现没有。
答案 5 :(得分:0)
我相信JavaScript RE是由ECMA标准定义的,我怀疑JS解释器之间存在很多差异。我没有在我的程序中找到任何内容,或者在文章中看到过。
你的消息实际上有点令人困惑,因为你在那里抛出ASP的东西。当你谈论服务器端技术或生成的代码时,我不知道你如何得出结论是浏览器的错误。实际上,我们甚至不知道你是在谈论浏览器上的JS,上传字段的验证(你不能再这样做,至少以简单的方式,使用FF3)或服务器端(既不是FF也不是Opera)也没有Safari上传上传文件的完整路径。我很惊讶地知道Chrome确实喜欢IE ...)。