如何编写匹配固定开头、任意顺序分组并捕获分类名的正则表达式
WordPress URL路径重写正则解决方案
需求匹配规则
- 匹配固定
c/开头的分类筛选路径 - 提取路径中第一段的分类名
- 支持后续任意顺序排列的
f-前缀筛选参数,分别捕获参数键名和参数值 - 输出单行正则,适配WordPress
add_rewrite_rule功能的PCRE正则规范
问题原因
原有正则(f-(brand|hair-porosity|shampoo-type)?-?(.*?)(/|$))存在两个核心缺陷:
- 未覆盖路径开头的
c/前缀和分类名捕获逻辑,无法提取分类字段 - PCRE正则(WordPress底层正则引擎)对重复出现的单个捕获组,只会保留最后一次匹配结果,因此会出现仅捕获第一个/最后一个f参数的问题,无法同时拿到所有筛选参数
可用单行正则
^c/([^/]+)(?:/f-(brand|hair-porosity|shampoo-type)-([^/]+))?(?:/f-(brand|hair-porosity|shampoo-type)-([^/]+))?(?:/f-(brand|hair-porosity|shampoo-type)-([^/]+))?/?$
使用说明
- 第1个捕获组固定返回分类名,直接映射到
category查询变量即可 - 正则中每一组
(?:/f-(brand|hair-porosity|shampoo-type)-([^/]+))?对应一个可选的筛选参数匹配块,支持参数任意顺序排列:- 块内第一个捕获组返回f参数的键名(如
brand、hair-porosity) - 块内第二个捕获组返回对应f参数的值
- 块内第一个捕获组返回f参数的键名(如
- 你可以根据实际支持的筛选参数最大数量,追加对应数量的匹配块;如果要新增筛选维度,直接在枚举键名的位置(
brand|hair-porosity|shampoo-type)按|新维度名的格式追加即可 - 匹配效果验证:
- 对路径
c/category-name/f-brand-super-brand/f-hair-porosity-POR,捕获结果为:分类名category-name、f-brand值super-brand、f-hair-porosity值POR - 对路径
c/exampleC/f-hair-porosity-my-porosity/f-brand-brandY(调换f参数顺序),捕获结果为:分类名exampleC、f-brand值brandY、f-hair-porosity值my-porosity
- 对路径
提示:拿到捕获结果后,遍历所有f参数匹配块的键值对,按键名映射到对应查询变量即可,不受参数排列顺序影响。
内容的提问来源于stack exchange,提问作者Vasco Costa
相关产品推荐
相关产品推荐

