Arrays Htaccess:多个参数和嵌套括号

Arrays Htaccess:多个参数和嵌套括号,arrays,.htaccess,mod-rewrite,Arrays,.htaccess,Mod Rewrite,我有一个项目,我在index.php上重定向每个请求,使用各种GET参数 目前,我正在使用这种htaccess(这只是一个摘录,为了简化问题,我将参数名称改为a、b、c…): 它可以工作(很好),但我正在考虑一种方法,将这些行缩小为一行。 这个想法是使用一些嵌套的圆括号来“生成”所有获取参数,但它似乎不像我想的那么容易 以下是我迄今为止所做的: RewriteRule ^(?:([\w-]+)\/)*([\w-]+)\.html$ index.php?a=$1&b=$

我有一个项目,我在
index.php
上重定向每个请求,使用各种
GET
参数

目前,我正在使用这种htaccess(这只是一个摘录,为了简化问题,我将参数名称改为
a、b、c…
):

它可以工作(很好),但我正在考虑一种方法,将这些行缩小为一行。 这个想法是使用一些嵌套的圆括号来“生成”所有
获取
参数,但它似乎不像我想的那么容易

以下是我迄今为止所做的:

RewriteRule 
    ^(?:([\w-]+)\/)*([\w-]+)\.html$ 
    index.php?a=$1&b=$2&c=$3&d=$4&e=$5&f=$6&g=$7&h=$8&i=$9 [L]
获取url的结果
http://website.com/1/2/3/4/5/6/7/8/9.html

array(9) { 
   ["a"]=> string(1) "8" 
   ["b"]=> string(1) "9" 
   ["c"]=> string(0) "" 
   ["d"]=> string(0) "" 
   ["e"]=> string(0) "" 
   ["f"]=> string(0) "" 
   ["g"]=> string(0) "" 
   ["h"]=> string(0) "" 
   ["i"]=> string(0) "" 
}
而不是获取
a=1
b=2
c=3
。。。我只收到最后两个参数。请注意,执行了
重写规则
,然后我知道我的正则表达式匹配


<记录>:

< P>记录:考虑使用基于PHP的方法:将整个请求的URI传递给PHP,然后您可以在PHP中处理整个事情,这比用MODE重写做魔术更容易,更可能更安全,甚至更快。p> 我的意思是这样的:

 RewriteRule ^(.*)\.html$ switchboard.php?uri=$1 [L]
然后在switchester.php中:

list($_GET['a'], $_GET['b'], $_GET['c']) = explode( '/', $_GET['uri']);
require 'index.php';
(如果超长列表()看起来很麻烦,可以使用一些巧妙的单行映射技术)

无论如何,正则表达式问题当然很有趣,但它是一个通用的PCRE问题。这种现象被称为“重复捕获组”:每当你像你一样用Kleene星重复一个捕获组时,实际上只会捕获最后一次迭代(在我们的例子中,匹配1,2..7被丢弃,只有8被保留)-将它想象为一个缓冲区,你不断用更新的匹配覆盖它。如果你仔细想想,这很有道理

一个解决方案是使用您实际想要捕获的任意多个组,方法是将以前的组设置为可选的-编写和读取非常困难(事实上,Arjan刚刚发布了它,仅仅看一下它就令人头疼),而且在这种情况下效率也非常低。一个更简单的解决方案是捕获整个内容并将其拆分

RewriteRule 
    ^([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+))?)?)?)?)?)?)?)?\.html$ 
    index.php?a=$1&b=$2&c=$3&d=$4&e=$5&f=$6&g=$7&h=$8&i=$9 [L]
未经测试,但我认为这符合你的要求。请注意,它适用于1到9个参数,至少需要一个。
还请注意,原始url中存在的任何GET参数都可以通过这种方式删除。

您试图解决的真正问题是什么?使用正则表达式并不总是最好的解决方案。我用粗体字表示:使用单个重写规则而不是9来完成相同的工作。在这种情况下,我并不真正关心性能,这更像是一个好奇的问题。因此,基本上你想知道是否有可能编写一个正则表达式来将url转换成一个有很多GET参数的东西。这应该是可能的,但也意味着您正在删除在原始url上指定的任何GET参数。这意味着它并不适用于任何项目。它已经删除了任何
GET
参数,但我只使用重写的URL,所以我肯定不会有任何问题。我只是在寻找一种更简短的方法来写我的规则,没有了。很有趣。。。感谢你为我的问题命名,我发现了一篇详细的文章:你,没有可能捕捉到每个组,写一行规则变得很尴尬!正如@Sat所说,这个解决方案很难看:)不管怎样,这是一个有效的单线解决方案,所以你得到了我的投票。谢谢你们两位的解释。这个解决方案很难看,这就是为什么我第一次想知道它真的是你想要的。
RewriteRule 
    ^([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+))?)?)?)?)?)?)?)?\.html$ 
    index.php?a=$1&b=$2&c=$3&d=$4&e=$5&f=$6&g=$7&h=$8&i=$9 [L]