Regex 为什么apache在重写规则中两次匹配字符串而不是一次?
我在应用的htaccess中有一个重写规则,它应该与那种字符串完全匹配:Regex 为什么apache在重写规则中两次匹配字符串而不是一次?,regex,apache,.htaccess,mod-rewrite,Regex,Apache,.htaccess,Mod Rewrite,我在应用的htaccess中有一个重写规则,它应该与那种字符串完全匹配:01,02,03,04,并将其作为GET参数附加到url中,如&option=$2。但相反,他匹配01,02,03,04,将其作为$option=$2追加,然后再次匹配04,并将其作为$otheroption=$3追加。我错过了什么 RewriteRule ^([a-zA-Z0-9_\-]+)/([a-zA-Z0-9_-]+)/(([0-9]{2}[,]?)+)/([a-zA-Z]+)$ /index.php?site=$
01,02,03,04
,并将其作为GET参数附加到url中,如&option=$2
。但相反,他匹配01,02,03,04
,将其作为$option=$2
追加,然后再次匹配04
,并将其作为$otheroption=$3
追加。我错过了什么
RewriteRule ^([a-zA-Z0-9_\-]+)/([a-zA-Z0-9_-]+)/(([0-9]{2}[,]?)+)/([a-zA-Z]+)$ /index.php?site=$1&content=$2&objektart=$3&vermarktungsart=$4 [QSA,L]
在
(([0-9]{2}[,]?)+)
中有两个括号,因此该部分两次捕获第三个参数。您可以使用集合中的第5个结果而不是第4个,或者更好地使用非捕获组。由于您只想在此处创建角色类,因此非捕获组是一种方法:
RewriteRule ^([a-zA-Z0-9_\-]+)/([a-zA-Z0-9_-]+)/((?:[0-9]{2}[,]?)+)/([a-zA-Z]+)$ /index.php?site=$1&content=$2&objektart=$3&vermarktungsart=$4
注意内括号开头的?:
。这意味着内容被视为一个组,但不适用于结果集
输入
aaa/bbb/3333/ccc
这将产生输出
/index.php?site=aaa&content=bbb&objektart=3333&vermarktungsart=ccc
我找到了一个解决方案
([0-9,]{2,})
,但我仍然认为上面的解决方案也应该如此…您可能需要编辑您的问题,因为预期结果和实际结果似乎是一样的。另外,请为输入和输出添加示例URL,但如果我将其设置为([0-9]{2}[,]?)+
,则只捕获最后一个数字。更新了您似乎需要的非捕获组的答案。很好。我想这就是我在这里错过的。谢谢你提出来。因为它更优雅,所以我会选择它。