正则表达式从URL中提取类别

时间:2016-05-23 07:05:38

标签: php regex

我有一个Slug aktuell/blog/cat1/cat2/cat3并且需要一个正则表达式从这个Slug中提取所有类别段('aktuell/blog'之后的所有部分)。 cataegory-segements的数量可能从零到无穷大。

我已经尝试了几种方法,但它从未按预期工作...... 我的最后一次尝试是:

^aktuell\\/blog(?:\\/(\w+))*$/g

但是这个Regex只返回最后一段作为匹配...... 我该怎么做才能获得所有类别?

感谢' S

4 个答案:

答案 0 :(得分:0)

这个正则表达式有效,但php Regex-Engine无法处理重复组中的匹配。每一场新比赛都会覆盖前一场......

所以我必须手动重复这个小组:

^aktuell\/blog(?:\/(\w+))?(?:\/(\w+))?(?:\/(\w+))?(?:\/(\w+))?(?:\/(\w+))?

答案 1 :(得分:0)

您可以使用这段代码来解决问题:

423 (Locked)

这是example

答案 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个以上的字母数字或下划线字符。
相关问题