Regex 如何在apache重写引擎中描述此URL?

Regex 如何在apache重写引擎中描述此URL?,regex,apache,apache2,Regex,Apache,Apache2,如何编写正则表达式以包含此类url: page/(various-option) 其中,各种选项可以是: page/gratis page/gratis-images page/weekly-images page/yearly-images page/yearly page/images (以及所有其他参数的组合)目前,我使用的是如下内容: RewriteRule ^page/((gratis)?\-?(weekly|yearly)?\-?(images)?)$ /page.php?opt

如何编写正则表达式以包含此类url:

page/(various-option)
其中,
各种选项
可以是:

page/gratis
page/gratis-images
page/weekly-images
page/yearly-images
page/yearly
page/images
(以及所有其他参数的组合)目前,我使用的是如下内容:

RewriteRule ^page/((gratis)?\-?(weekly|yearly)?\-?(images)?)$ /page.php?options=$1 [L]
(注意:我省略了其他参数)

在我编写的重写引擎中,出现了一个问题,例如,一个格式错误的url也会被解析:

page/-yearly-
甚至更糟的是:

page/--images
谢谢你的建议

地址1:

weekly freatis weekly
是错误的,应该拒绝

当然有5个参数(但我认为如果参数是3,正则表达式不会改变)

所有参数都可以组合(当然,除了像weeky这样的参数)

地址2(@tim):

参数的顺序很重要

这是不允许的
page/images每年免费
(但是我写的正则表达式已经检查了Order)在这种情况下正确的url是

page/gratis-yearly-images
试一试

说明:

^            # start
page/        # page/
(            # start capturing
 (?:gratis   # try matching "gratis"
  (?=$|-.)   # if it's the last item or followed by - and more characters
 )?          # optional match
 -?          # match a - if possible
 (?:         # the same with weekly|yearly
  (?:weekly|yearly)
  (?=$|-.)
 )?
 -?
 (?:images)? # finally, try matching images.
)            # end of capture
$            # end of string

还值得一提的是,上述规则仅适用于.htaccess文件。如果要将其放入apache配置文件中,模式应以
^/page

开头,是否需要拒绝多次出现的选项?
page/weekly freatis weekly
是否可能并且必须被捕获?有多少个不同的参数,并且它们都可以任意组合?请列出所有参数及其出现的顺序。@tim:我在那里写的参数非常适合作为示例(免费)-(每周|每年)-(图像)page/-images是合法的URL吗?页面/图像是合法的URL吗?从你的例子来看,似乎没有一个是好的,这个模式拒绝两者。请在您的示例中说明这一点。您在Apache中试用过吗?我很确定页面/图像不会通过这种模式。嘿,伙计,试试看。我要强调的是,这种模式不是:*年度?(-图片-年度条款后没有问号。@yes123:你否决了这个,因为这是一个错误的答案?我写了一个明确的评论,为什么我否决了这个主题。它仍然有效,我还要加上“否决工作答案”到列表中。-我不知道是什么让你对试图解决你的问题的人变得个人化,我真的不在乎。我已经没有什么要添加到这个对话中了。这是一个非捕获组。我需要对它进行分组,以便我可以将
应用到整个组中,但我以后不需要引用它(就像在
$1
中,我确实需要为周围的团队提供这个功能)。这就是我的意思。因为我不需要更多的功能,所以我不需要更多的捕获括号。
^            # start
page/        # page/
(            # start capturing
 (?:gratis   # try matching "gratis"
  (?=$|-.)   # if it's the last item or followed by - and more characters
 )?          # optional match
 -?          # match a - if possible
 (?:         # the same with weekly|yearly
  (?:weekly|yearly)
  (?=$|-.)
 )?
 -?
 (?:images)? # finally, try matching images.
)            # end of capture
$            # end of string
RewriteRule ^page/(((gratis)(-|$))?((weekly|yearly)(-|$))?(images)?)$ /page.php?options=$1 [L]