【问题标题】:Seemingly identical Regex Apache RewriteRule... What is the difference?看似相同的 Regex Apache RewriteRule... 有什么区别?
【发布时间】:2011-07-28 16:32:23
【问题描述】:

亲爱的, 我想弄清楚这两者之间有什么区别

RewriteRule ^([a-z][a-z])/(.*?)(-.*)?$   /$2?ln=$1 [L]
RewriteRule ^([a-z][a-z])/([^/]+)(-.*)?$ /$2?ln=$1 [L]

它们看起来一模一样,而且似乎都可以正常工作,但肯定有区别...

应安装其中任何一个以在文件名后面使用可选信息进行重定向:

例如en/something-to-love >> something?ln=en

【问题讨论】:

  • 好问题。我希望这对消除 RegEx 有所帮助。

标签: regex apache url mod-rewrite apache2


【解决方案1】:

'.' 点被过度使用并且很少需要。 言出必行,言出必行!我会这样写:

RewriteRule ^([a-z]{2})/([^/\-]+)(-[^/]*)?$ index.php?ln=$1 [L]

【讨论】:

    【解决方案2】:

    虽然它们可能相似,但它们并不相同

    • .*? - 任何字符(惰性)或无
    • [^/]+ - 除斜线 (/) 以外的任何字符,至少一个

    第二个不是懒惰的,所以你会得到something-to-love?ln=en(要只得到something,最后加一个问号:[^/]+?)。

    这两个选项之间的选择取决于您的需要。

    顺便说一句,您可以将[a-z][a-z] 缩小为[a-z]{2}

    【讨论】:

      【解决方案3】:

      有很大的不同。让我们在字符串 aa/bbb/cccc/ddd/-eeeee 上测试这两个表达式。第一个

      ^([a-z][a-z])/(.*?)(-.*)?$
      

      将产生三个匹配组

      1: (aa)
      2: (bbb/cccc/ddd/)
      3: (-eeeee)
      

      而第二个 ^([a-z][a-z])/([^/]+)(-.*)?$ 将不匹配任何内容。

      关键是在第一个表达式中你有(.*?)(-.*)?,这意味着第一组是任何东西,直到找到-。如果 - 匹配,则开始第三组。

      在第二个表达式中你有([^/]+)(-.*)?,即将所有直到 / 的东西放到第二组,然后如果 - 匹配,创建第三组。问题在于 not 匹配 / 并使用 - 开始新组。

      如果您在两个字符串 aa/bbb-/eeeeeaa/bbb/-eeeee 上测试您的第二个表达式,您会看到只有第一个字符串会导致任何匹配项

      1: (aa)
      2: (bbb)
      3: (-/eeeee)
      

      第二个不会。

      希望它有所帮助。

      注意:我已经在www.RegexTester.com 进行了所有提到的测试。

      【讨论】:

        【解决方案4】:

        Apache 默认是 lazy。所以在重写.*.*? 是相等的。这就是为什么你的[^/]+ 真的是[^/]+?

        第一个之后没有 /,所以 [^/]. 产生相同的结果。

        *+ 开始,你知道在你的URL 中en/ 之后肯定会有一些东西,所以* 只是更广泛,它总是+(至少一个字符将跟随正斜杠)。

        如果您应用这些事实,很容易看出它们在您的情况下同样有效。

        【讨论】:

        • “Apache 默认是惰性的。” 你从哪里读到的?我不这么认为!
        • @ridgerunner 我猜很实用。否则([^/]+) 只会吃掉URL 中的- 字符。 - 但如果你不相信我可以测试它。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-16
        • 2011-10-14
        • 2021-09-27
        • 2019-02-19
        • 1970-01-01
        • 2012-11-15
        • 2012-05-04
        相关资源
        最近更新 更多