【问题标题】:Regex to extract categories from URL正则表达式从 URL 中提取类别
【发布时间】:2016-05-30 15:53:12
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

  • 您是将段作为$_GET 变量传递给PHP,还是URL 仅作为字符串提供?如果您作为变量传递,请循环通过 $_GET 来检索值。如果没有,那么用分隔符“/”分解你拥有的字符串并找到你想要的段!
  • URL 只能作为字符串使用。我有一个路由类,它处理正则表达式模式(来自 db)并向我返回路由 ID 和所有匹配项。所以我不能使用explode ... :(
  • 为什么不使用这种模式:aktuell\/blog\/(.*) 并在"/" 上爆炸?
  • 纯正则表达式:/(?:^aktuell\/blog|\G(?!^))(?:\/(\w+))/g
  • @SebastianProske:我认为应该发布一个答案。

标签: php regex


【解决方案1】:

此正则表达式有效,但 php 正则表达式引擎无法处理重复组中的匹配项。每一个新的匹配都会覆盖前一个......

所以我必须手动重复该组:

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

【讨论】:

  • 您真的不能访问多个匹配项吗?请参阅上面 Sebastian 的建议,该建议适用于 preg_match_all 函数(如果您在最后删除 g)。
  • 如果他的建议有效,请让他知道,以便他发布答案以获得他的建议的功劳。
【解决方案2】:

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

$uri = $_SERVER['REQUEST_URI'];
$uri_arr = explode("/",$uri);
$cat = array();
array_map(function($v) use (&$cat){
    preg_match('/^cat\d$/',$v,$matches);
    if(count($matches) > 0){
        $cat[] = $matches[0];
      }
},$uri_arr);
print_r($cat);

这是example

【讨论】:

    【解决方案3】:

    /(?:^aktuell\/blog|\G(?!^))(?:\/(\w+))/preg_match_all() 结合使用效果很好!

    非常感谢@WiktorStribiżew 和@SebastianProske

    【讨论】:

    • 由于 Sebastian 不想提供答案,所以我提出了自己的建议。
    【解决方案4】:

    问题是重复捕获的组总是将最后捕获的值存储在它们的缓冲区中。

    您可以将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+ 个字母数字或下划线字符。

    【讨论】:

    • 请注意,接受其他用户发布的答案(我猜是第一次)您将获得 2 分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    相关资源
    最近更新 更多