【问题标题】:Regular expressions: Differences between browsers正则表达式:浏览器之间的差异
【发布时间】:2010-09-21 09:38:50
【问题描述】:

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

^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.pdf)$

这适用于 Internet Explorer 和 Google Chrome,但不适用于 Firefox。测试总是失败,即使是实际的 PDF。所以我认为多余的东西无关紧要,并将其简化为:

^.+\.pdf$

现在它在 Firefox 中运行良好,并且在 IE 和 Chrome 中继续运行。
这是 ASP.NET 中的 asp:FileUpload 和 RegularExpressionValidator 控件特有的怪癖,还是仅仅是因为不同的浏览器以不同的方式支持正则表达式?无论哪种方式,您遇到过哪些后者?

【问题讨论】:

  • 正则表达式所能控制的只是文件名以“.pdf”结尾(考虑到它似乎适用于 Windows,它可能需要不区分大小写)。它对文件的内容不做任何形式的保证——不要对差异感到困惑。病毒编写者依赖于此。
  • 我觉得这与这个问题没有太大关系。我会冒昧地说“没有人”能够读/写正则表达式,愚蠢到认为文件扩展名可以验证内容。它所做的是帮助避免在上传时浪费服务器带宽、存储和周期,甚至没有命名正确的类型!
  • 再一次,你很困惑......如果你想通过避免上传错误类型的文件来节省带宽,你必须在浏览器端验证......如果可能的话,这变得很难FF3,正如我所写。

标签: regex cross-browser consistency


【解决方案1】:

如果您使用的是 javascript,则不使用斜杠将正则表达式括起来会导致 Firefox 出错。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        然而,Jonathan 对原始问题的评论怎么强调都不过分。永远,永远,永远,永远相信文件名是确定其内容的充分手段。或者 MIME 类型,就此而言。与您的 Web 服务器(甚至可能不是浏览器)通信的客户端软件可能会在任何事情上对您撒谎,除非您验证它,否则您永远不会知道。在这种情况下,这意味着将接收到的文件输入到一些可以理解 PDF 格式的代码中,并让该代码告诉您它是否是有效的 PDF。检查文件名可能有助于防止人们尝试提交明显不正确的文件,但这不足以对收到的文件进行测试。

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

        【讨论】:

        • 您对跨平台兼容性的评论是可靠的,而原始编码人员显然没有考虑到这一点。这并不是对实际问题的真正答案,也不是关于文件上传类型的充分测试的问题(请参阅我对问题的评论)
        • 我很抱歉试图提供一个广泛的答案,以解决与您具体解决的问题相关的情况,以防它们将来可能与其他人相关。 (或者对您而言,鉴于您没有说明您是否严格针对 Windows。)
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          您的消息实际上有点令人困惑,因为您将 ASP 东西扔在那里。当您谈论服务器端技术或生成的代码时,我不明白您如何得出结论是浏览器的错。实际上,我们甚至不知道您是在谈论浏览器上的 JS,上传字段的验证(您不能再这样做,至少以简单的方式,使用 FF3)还是在服务器端(FF 和 Opera 都不是) Safari也没有上传上传文件的完整路径。我很惊讶Chrome确实喜欢IE...)。

          【讨论】:

          • 浏览器肯定存在差异,尽管它们可能很微妙。很抱歉,您发现该消息令人困惑,之所以如此,是因为我不知道问题出在哪里。原来是FF没有提供完整的上传路径。我不知道你为什么说你不能用 FF3 来验证。
          • 我的意思是在FF3中,JavaScript不能再访问文件输入字段中的路径。你可以在FF2中做的事情。这两个版本都没有提供完整路径,因为大多数时候它在服务器端是无用的,甚至是安全漏洞。
          • 浏览器之间肯定存在差异。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-10
          • 1970-01-01
          • 2011-11-28
          • 2018-07-16
          • 2012-05-09
          相关资源
          最近更新 更多