.htaccess 在htaccess - regex中将URL拆分为三个部分

i5desfxk  于 2023-01-31  发布在  其他
关注(0)|答案(2)|浏览(184)

我试图分裂任何网址,将显示在我的网站分为三个部分:
1.语言(可选)
1.页面的层次结构(父级)
1.当前页
现在我用1和3操作,但我需要开发一种方法,允许页面具有相同的名称,如果他们有不同的父母,因此完整的URL是唯一的。
以下是我可能拥有的URL类型:

(nothing)
en
en/test
en/parent/test
test
parent/test
ggparent/gparent/parent/test

我考虑过延长我目前的指令:

RewriteRule ^(?:([a-z]{2})(?=\/))?.*(?:\/([\w\-\,\+]+))$ /index.php?lang=$1&page=$2 [L,NC]

改为:
(?:([a-z]{2})(?=\/))?(.*)\/([^\/]*)?$
然后我可以将其转换为index.php?lang=$1&tree=$2&page=$3,但我遇到的困难是,第二个捕获组从一开始就捕获斜杠。
我认为我不能(根据我目前的搜索)动态地返回斜杠之间的所有字符串,并使最后一个总是第一个,而不重复相同的正则表达式。我想我会捕获语言和当前页面之间的任何内容,并在PHP中处理树。
然而,我目前的正则表达式有一些问题,我不能找出他们:
1.如果语言是独立的,它就不会被捕捉到
1.第二组捕捉语言和树之间的斜线
Regex101链接:https://regex101.com/r/ecHBQT/1

pkwftd7m

pkwftd7m1#

这很可能是:在适当的位置用斜杠将URL拆分为lang、tree和page,这三个部分都可以为空:

RewriteRule ^([a-z]{2}\b)?\/?(?:\/?(.+)\/)?(.*)$ /index.php?lang=$1&tree=$2&page=$3 [L,NC]

JavaScript中使用此正则表达式的测试用例:

const regex = /^([a-z]{2}\b)?\/?(?:\/?(.+)\/)?(.*)$/;
[
  '',
  'en',
  'en/test',
  'en/parent/test',
  'test',
  'parent/test',
  'ggparent/gparent/parent/test'
].forEach(str => {
  let rewritten = str.replace(regex, '/index.php?lang=$1&tree=$2&page=$3');
  console.log('"' + str + '" ==>', rewritten);
})

输出:

"" ==> /index.php?lang=&tree=&page=
"en" ==> /index.php?lang=en&tree=&page=
"en/test" ==> /index.php?lang=en&tree=&page=test
"en/parent/test" ==> /index.php?lang=en&tree=parent&page=test
"test" ==> /index.php?lang=&tree=&page=test
"parent/test" ==> /index.php?lang=&tree=parent&page=test
"ggparent/gparent/parent/test" ==> /index.php?lang=&tree=ggparent/gparent/parent&page=test

注:

liwlm1x9

liwlm1x92#

希望我没理解错你的问题,你可以试试这个正则表达式:

^([a-z]{2}(?=\/|$))?(?:\/?(.+)\/)?(.*)

Regex demo.
这将匹配3组:首先是语言(两个字符),然后是父组,最后一个组是URL的最后一部分(/之后)。

相关问题