如何使用正则表达式多次匹配一个组

How to use regex to match a group multiple times

抱歉标题不好,我不知道如何正确表达。 我有一个URL比如/colour-white/size-large/,我需要在htaccess中重写它。 在正则表达式之后,字符串应该看起来像 &colour=white&size=large。

我不想多次重写颜色、尺寸、颜色和尺寸。

我在字符串 colour-white/size-large/ 上想出了 (colour|size)-(.*?)\/ 并替换了 =& 其中 returns colour=white&size=large&,但是当有a / 在开头,我不希望最后的字符串有尾随 &.

编辑:\/*(colour|size)-(.*?)\/ &= 有效,但一旦前面有其他文本,它就会中断,我猜是因为使用全局选项,它会在每次查找颜色或时尝试匹配前面的文本尺寸。

为不同数量的参数添加多个重写规则是很常见的。这有效,包括它之前的内容(“连衣裙”)最多三个参数。添加第四个参数只是第四行。所需的规则数量随参数数量线性增加,而不是指数增加。

RewriteEngine on
RewriteRule /?(.*/)?(colour|size|rarity)-([^/]+)/(colour|size|rarity)-([^/]+)/(colour|size|rarity)-([^/]+)/ ?=&=&= [L]
RewriteRule /?(.*/)?(colour|size|rarity)-([^/]+)/(colour|size|rarity)-([^/]+)/ ?=&= [L]
RewriteRule /?(.*/)?(colour|size|rarity)-([^/]+)/ ?= [L]

另一种方法是将所有这些作为单个参数传递并在您的处理程序中对其进行解析。在 PHP、Java、Perl 或任何你的后端语言中解析任意参数要干净得多。此代码会将任意数量的它们放入要在后端解析的“选项”参数中:

RewriteEngine on
RewriteRule /?(.*/)?(colour|size|rarity-[^/]+/)+ ?options= [L]

你也应该退后一步,问问这是否是你真正想要或需要做的事情。将任意参数粘贴到 URL 路径中 与将它们放在查询字符串中相比, 对 SEO 更不友好。你最好的 URL 实际上可能是 /dresses?size=large&colour=blue 你可以在 my answer to SEO-friendly way to pass multiple values in a URL parameter

中阅读我的完整推理