gpt4 book ai didi

正则表达式具有可选参数的多个 URL,一些需要反向引用,一些不需要

转载 作者:行者123 更新时间:2023-12-02 09:32:18 27 4
gpt4 key购买 nike

我有一组 URL,我正在为其执行 301 重定向(使用 Nginx,我认为它使用 PCRE 作为其 Regex 引擎)。这是所需内容的简化版本:

  • /旧/
    • 重定向到/new/
  • /old/1234/
    • 重定向到 /new/1234/
  • /old/1234/foo/
    • 重定向到 /new/1234/foo/
  • /old/1234/bar/
    • 重定向到/new/1234/bar/
  • /old/1234/expired/
    • 重定向到 /new/1234/

即对此的过度简化可以说 /old/(.*) 重定向到 /new/$1,除非 url 的最后一部分是 /[0-9]+/expired/,在这种情况下,它只是上升了一个级别。 (除非我真的需要通过匹配 URL 的 foobar expired1234 部分使其更具体).

如果可能的话,我想在一个正则表达式中涵盖所有这些,而不是为每个变体设置多个规则。

到目前为止,我在 Nginx.conf 中的正则表达式是这样的:

location ~* ^/old/(([0-9]+/)expired/)?|([0-9]+/(foo|bar/)?)?$ {
return 301 /new/$1;
}

显然这是不对的。总结:

  • 如果 url 以 /expired/ 结尾,我只想获取 /[0-9]+/ 部分。
  • 以及整个 /[0-9]+/foo//[0-9]+/bar/ 部分,如果它以 foo 或 bar 结尾。
  • 如果以 /[0-9]+/ 结尾,则仅此部分。
  • 如果它只是以 /old/ 结尾,那么只需重定向到 /new/

最佳答案

只要斜杠没问题,下面的正则表达式就可以与 PCRE 一起使用。

 ^/old/([0-9]+/.*?)?(?:expired/)?$
  • ^/old/ -> 匹配从开始到/old 的所有内容
  • ([0-9]+/.*?)? -> 可选地匹配 LAZILY 之后的数字/和任何文本。显然,匹配的不仅仅是 foo 和 bar。
  • (?:expired/)?$ -> 可选匹配expired,配合上一步的lazy引擎会一直逐个char查,如果过期则结束接下来是字符串,然后过期将从捕获组中删除。

使用/new/$1 的结果:

/new/
/new/1234/
/new/1234/foo/
/new/1234/bar/
/new/1234/

关于正则表达式具有可选参数的多个 URL,一些需要反向引用,一些不需要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31726362/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com