Regex 正则表达式:浏览器之间的差异

Regex 正则表达式:浏览器之间的差异,regex,cross-browser,consistency,Regex,Cross Browser,Consistency,我越来越意识到,在浏览器解释正则表达式的方式上肯定存在重大差异。 例如,一位同事编写了此正则表达式,以验证正在上载的文件是否具有PDF扩展名: ^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.pdf)$ 这在InternetExplorer和GoogleChrome中有效,但在Firefox中不起作用。测试总是失败,即使是对于实际的PDF。因此,我认为额外的内容无关紧要,并将其简化为: ^.+\.pdf$ 现在它在Firefox中运行良好,在IE和Ch

我越来越意识到,在浏览器解释正则表达式的方式上肯定存在重大差异。
例如,一位同事编写了此正则表达式,以验证正在上载的文件是否具有PDF扩展名:

^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.pdf)$
这在InternetExplorer和GoogleChrome中有效,但在Firefox中不起作用。测试总是失败,即使是对于实际的PDF。因此,我认为额外的内容无关紧要,并将其简化为:

^.+\.pdf$
现在它在Firefox中运行良好,在IE和Chrome中也能继续工作。

这是asp.NET中asp:FileUpload和RegularExpressionValidator控件特有的怪癖,还是仅仅因为不同的浏览器以不同的方式支持正则表达式?不管是哪种方式,您遇到的后一种情况是什么?

如果您使用的是javascript,不使用斜杠封闭正则表达式会导致Firefox中出现错误


尝试执行
var regex=/^([a-zA-Z]:)|(\\{2}\w+\$?)(\\\(\w[\w].*))(.pdf)$/

如果您使用的是javascript,不使用斜杠封闭正则表达式会导致Firefox出错


尝试执行
var regex=/^([a-zA-Z]:)|(\\{2}\w+\$?)(\\\(\w[\w].*))(.pdf)$/

据我所知,firefox不允许您拥有上传的完整路径。在这种情况下,正则表达式的解释似乎无关紧要。我还没有看到现代浏览器在正则表达式执行方面有什么不同。

据我所知,firefox不允许您拥有完整的上传路径。在这种情况下,正则表达式的解释似乎无关紧要。我还没有看到现代浏览器在正则表达式执行方面有什么不同。

我没有注意到浏览器在模式语法方面有什么不同。但是,我注意到C#和Javascript之间存在差异,因为C#的实现允许反向引用,而Javascript的实现不允许反向引用。

我没有注意到浏览器之间在模式语法方面存在差异。但是,我注意到C#和Javascript之间存在差异,因为C#的实现允许反向引用,而Javascript的实现不允许反向引用。

关于实际问题:原始正则表达式要求值以驱动器号或UNC设备名称开头。很有可能Firefox只是没有将其包含在文件名中。还要注意的是,如果您有跨平台的意图,那么regex在任何非Windows系统上都会失败,无论浏览器如何,因为它们不使用驱动器号或UNC路径。您的简化正则表达式(“接受任何东西,只要它以.pdf结尾”)的文件名检查效果与您将得到的一样好

然而,乔纳森对最初问题的评论怎么强调也不过分。永远不要相信文件名是确定其内容的适当手段。或者说是MIME类型。与您的web服务器(甚至可能不是浏览器)交谈的客户端软件可能会对您撒谎,除非您验证,否则您永远不会知道。在本例中,这意味着将接收到的文件输入到理解PDF格式的代码中,并让该代码告诉您它是否是有效的PDF。检查文件名可能有助于防止人们试图提交明显不正确的文件,但这并不是对所接收文件的充分测试


(我知道您可能知道需要额外的验证,但下一个遇到类似情况并发现您的问题的人可能不知道。)

关于实际问题:原始正则表达式要求值以驱动器号或UNC设备名称开头。很有可能Firefox只是没有将其包含在文件名中。还要注意的是,如果您有跨平台的意图,那么regex在任何非Windows系统上都会失败,无论浏览器如何,因为它们不使用驱动器号或UNC路径。您的简化正则表达式(“接受任何东西,只要它以.pdf结尾”)的文件名检查效果与您将得到的一样好

然而,乔纳森对最初问题的评论怎么强调也不过分。永远不要相信文件名是确定其内容的适当手段。或者说是MIME类型。与您的web服务器(甚至可能不是浏览器)交谈的客户端软件可能会对您撒谎,除非您验证,否则您永远不会知道。在本例中,这意味着将接收到的文件输入到理解PDF格式的代码中,并让该代码告诉您它是否是有效的PDF。检查文件名可能有助于防止人们试图提交明显不正确的文件,但这并不是对所接收文件的充分测试


(我知道你可能知道需要额外的验证,但下一个遇到类似情况并发现你的问题的人可能不知道。)

正如Dave提到的,Firefox没有给出路径,只给出文件名。正如他所提到的,它没有考虑到操作系统之间的差异。我认为你能做的最好的检查就是检查文件名是否以PDF结尾。此外,这并不能确保它是有效的PDF,只是文件名以PDF结尾。根据您的需要,您可能希望通过检查内容来验证它是否为PDF。

正如Dave提到的,Firefox不提供路径,只提供文件名。正如他所提到的,它没有考虑到操作系统之间的差异。我认为你能做的最好的检查就是检查文件名是否以PDF结尾。此外,这并不能确保它是有效的PDF,只是文件名以PDF结尾。根据您的需要,您可能希望通过检查内容来验证它实际上是PDF。

我相信JavaScript REs是由ECMA标准定义的,我怀疑JS解释器之间是否存在许多差异。在我的程序中,我没有找到任何