Php 获取url以使用或不使用子表达式

Php 获取url以使用或不使用子表达式,php,mod-rewrite,Php,Mod Rewrite,我正试图重写一个像这样的url php?sort=66&search=s&category=2,3,4&archive=june&page=3 到 page-sort-1-搜索-类别-1,2,3-存档(6月)-第3页 但问题是,每次调用这个页面时,每个子表达式都可能不在url中,所以我必须将每个子表达式都放在“()?”中,这样正则表达式可以使用它们,也可以不使用它们 ^page (-sort-([0-9]*))? (-search\(([a-z]*)\))? (-category-(

我正试图重写一个像这样的url

php?sort=66&search=s&category=2,3,4&archive=june&page=3

page-sort-1-搜索-类别-1,2,3-存档(6月)-第3页

但问题是,每次调用这个页面时,每个子表达式都可能不在url中,所以我必须将每个子表达式都放在“()?”中,这样正则表达式可以使用它们,也可以不使用它们

^page
(-sort-([0-9]*))?     
(-search\(([a-z]*)\))? 
(-category-([0-9][,]?*))? 
。。。。。。。。。。。。。 你明白了吗

现在的问题是模式重写将括号中的每个子表达式视为实际变量

(-sort-([0-9]*))?  this is how mode rewrite interpret this  => $1 = -sort-66  ,  $2 = 66 
对于每个子表达式,我得到了2个捕获组,对于一个5-6变量的链接,这比10多 在模式重写中有9个匹配限制


我必须承认,我对你问题的某些部分感到有点困惑,所以如果我的回答完全不正确,我提前向你道歉。但听起来你需要的是一个非捕获组。这:

(...)
匹配
并创建一个捕获组(您称之为“变量”);这:


只匹配
,而不创建捕获组。因此,如果您只想对一个子表达式进行分组,而不将其所有内容保存为
$1

thanx,那么它很有用,但是当我使用(?:subexp)时,url在没有特定子表达式的情况下无法工作,我想要的是url在有或没有该子表达式的情况下工作,有没有办法做到这一点,或者我应该为每种可能的情况写一个正则表达式?@max:对不起,我想你误解了我的意思。我不是建议您将
(…)?
更改为
(?:…)
。我建议您将
(…)
更改为
(?:…)
——也就是说,您将
(…)?
更改为
(?:…)?
。如果子表达式是可选的,则在其后面仍然需要问号。这有意义吗?
(?:...)