0

我在这种形式的 URL 中使用开头的两个假子目录来表示区域和语言:

/gb/en/tours/lesson-observation

当开头的两个假子目录分别为 2-3 和 2-5 个字符时,此正则表达式匹配。(旁注:我不知道为什么我必须在{1,2}这里使用而不是{2,3}。)

/^\/.{1,2}[^\/]\/.{1,4}[^\/]\/(.*)/

当请求的 URL与模式匹配时^/2-3chars/2-5chars/,如何获取整个原始请求的 URL,以便我可以重定向到/gb/en$1. (这是需要的,因为该站点的英国地区和英语版本是默认的,如果在请求的 URL 中找不到地区和语言代码,则应使用该版本。)

例子:

/page-name
is not matched by the /2-3/2-5 pattern and so should be redirected to:
/gb/en/page-name

/ca/fr/page-name
is matched by the /2-3/2-5 pattern and so should not be redirected
4

1 回答 1

0

为了匹配这个:

/gb/en/tours/lesson-observation

您可以使用:

/[^/]{2,3}/[^/]{2,5}/.*

现在,您需要检测前两个段何时不在这些范围内,因此第一个段高于或低于 2 - 3 个字符:

/[^/]?/                   <-- 0 or 1 characters
/[^/]{4,}/                <-- 4 or more characters
/(?:[^/]?|[^/]{4,})/     <-- Combine the above two with an OR (|)

同样,对于第二段:

/(?:[^/]?|[^/]{5,})/     <-- 0 or 1 characters, or 5 or more characters

将两者放在一起,您就有了一个正则表达式,用于与我们的第一个正则表达式不匹配的任何内容:

/(?:[^/]?|[^/]{4,})/(?:[^/]?|[^/]{5,})/.*

请注意,在所有这些正则表达式中,我都省略了分隔符,但请记住,您不必使用/分隔符。您可以使用#~任何您想要的字符。好处:如果您不用/作分隔符,这允许您/在最终的正则表达式中保持未转义:

#/(?:[^/]?|[^/]{4,})/(?:[^/]?|[^/]{5,})/.*#   <-- # is the delimiter

编辑:由于第二个 URL 段是可选的,我们需要这样的第二段:

(?:/(?:[^/]?|[^/]{5,})/)?

将其带回完整的正则表达式,我们得到(带有锚点和分隔符:

#^/(?:[^/]?|[^/]{4,})(?:/(?:[^/]?|[^/]{5,})/)?.*$#
于 2013-02-21T03:59:24.117 回答