我有一个Slug aktuell/blog/cat1/cat2/cat3
并且需要一个正则表达式从这个Slug中提取所有类别段('aktuell/blog'
之后的所有部分)。
cataegory-segements的数量可能从零到无穷大。
我已经尝试了几种方法,但它从未按预期工作...... 我的最后一次尝试是:
^aktuell\\/blog(?:\\/(\w+))*$/g
但是这个Regex只返回最后一段作为匹配...... 我该怎么做才能获得所有类别?
感谢' S
答案 0 :(得分:0)
这个正则表达式有效,但php Regex-Engine无法处理重复组中的匹配。每一场新比赛都会覆盖前一场......
所以我必须手动重复这个小组:
^aktuell\/blog(?:\/(\w+))?(?:\/(\w+))?(?:\/(\w+))?(?:\/(\w+))?(?:\/(\w+))?
答案 1 :(得分:0)
答案 2 :(得分:0)
/(?:^aktuell\/blog|\G(?!^))(?:\/(\w+))/
与preg_match_all()
结合使用效果很好!
非常感谢@WiktorStribiżew和@SebastianProske
答案 3 :(得分:0)
问题是重复捕获的组总是将最后捕获的值存储在缓冲区中。
您可以将preg_match_all
与以下正则表达式一起使用:
/(?:^aktuell\/blog|(?!^)\G)\/\K\w+/
或(以避免转义正斜杠):
'~(?:^aktuell/blog|(?!^)\G)/\K\w+~'
请参阅regex demo
模式详情:
(?:^aktuell\/blog|(?!^)\G)
- 匹配字符串的开头和aktuell/blog
之后(参见^aktuell\/blog
)或(|
)字符串中上一次成功匹配的结束(与(?!^)\G
)\/
- 匹配/
符号\K
- 使正则表达式引擎省略到目前为止匹配的文本\w+
- 匹配/
,然后捕获1个以上的字母数字或下划线字符。