我真的是regexp中的新手,我无法弄清楚如何做到这一点。
我的目标是让RewriteRule
将请求网址路径分为3个部分:
example.com/foo
#should return: index.php?a=foo&b=&c=
example.com/foo/bar
#should return: index.php?a=foo&b=bar&c=
example.com/foo/bar/baz
#should return: index.php?a=foo&b=bar&c=baz
example.com/foo/bar/baz/bee
#should return: index.php?a=foo&b=bar&c=baz/bee
example.com/foo/bar/baz/bee/apple
#should return: index.php?a=foo&b=bar&c=baz/bee/apple
example.com/foo/bar/baz/bee/apple/and/whatever/else/no/limit/in/those/extra/parameters
#should return: index.php?a=foo&b=bar&c=baz/bee/apple/and/whatever/else/no/limit/in/those/extra/parameters
简而言之,网址路径中的第一个分段(foo
)应该提供给 a ,第二个分段(bar
)应该提供给 b ,以及 c
我想这个
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(([a-z0-9/]))?(([a-z0-9/]+))?(([a-z0-9]+))(.*)$ index.php?a=$1&b=$2&c=$3 [L,QSA]
</IfModule>
但显然不起作用,我甚至不知道我想要的是否可能。
有什么建议吗?
修改 在与教练经理一起训练之后,我也得到了这个:
RewriteRule ^([^/]*)?/?([^/]*)?/?(.*)?$ index.php?a=$1&b=$2&c=$3 [L,QSA]
答案 0 :(得分:1)
我可能会使用此规则(与您的规则类似):
RewriteRule ^([^/]+)?/?([^/]+)?/?(.*) index.php?a=$1&b=$2&c=$3 [L,QSA]
如果您不想允许尾部斜杠,可以使用此规则删除它们:
RewriteRule (.*)/$ /$1 [L,R=301]
答案 1 :(得分:0)
这个怎么样:
RewriteRule ^/([a-z0-9]+?)(?:/([a-z0-9]+?)){0,1}(?:/(.*)){0,1}$ [L,QSA]
我注意到你的正则表达式存在以下问题:
在你的第一个小组中,你只是在寻找第一个字符 - 字符组后面的+符号表示只要有至少一个字符就可以匹配任意数量的字符组。
< / LI>您只需要一组括号来匹配子表达式
?运算符(这是为了让匹配变得懒惰吗?)应该在重复运算符之后直接运行(+)
我还认为请求URI以/开头,而你的正则表达式中缺少
您选择的论坛2和3的语法不太正确(?:stuff here){0,1}
表示可能会出现“此处的内容”或者可能不会
我在一个名为The Regex Coach的优秀程序中对此进行了测试,该程序提供了以下内容
/foo (or /foo/) = index.php?a=foo&b=&c=
/foo/bar (or /foo/bar/) = index.php?a=foo&b=bar&c=
/foo/bar/any/number/of/other/parameters/after/the/third/one = index.php?a=foo&b=bar&c=any/number/of/other/parameters/after/the/third/one