首页 > 解决方案 > 模式匹配后结果数组的 URL 路径的剩余部分

问题描述

我很难让我的正则表达式做我想做的事情:(

我希望我的正则表达式做以下两件事:

  1. 在“品牌”或“个人资料”的模式匹配之后找到作为下一个 URL 路径部分的 ID
  2. 除了将 ID 之后的 URL 路径部分的其余部分拆分为匹配数组中的单独项目之外,ID 之后的 URL 路径部分的数量可以从无到多个不等,并且尾部斜杠并不总是存在

我设法通过以下方式使第一部分工作:

    <?php
    $url = 'https://demo.com/show/profile/123/slug/etc/';
    $pattern = '/\/(brand|profile)?\/([\d]+)/';
    preg_match($pattern, $url, $matches);
    var_dump($matches);

适用于所有这些测试字符串:

    https://demo.com/show/profile/123
    https://demo.com/show/profile/123/
    https://demo.com/show/profile/123/slug
    https://demo.com/show/profile/123/slug/
    https://demo.com/show/profile/123/slug/etc
    https://demo.com/show/profile/123/slug/etc/

但我似乎无法解决第二部分,即使在寻找了几天的解决方案之后。到目前为止,我最“成功”的尝试是:

    \/(brand|profile)?\/([\d]+)\/?(.*)?\/?

该模式将 URL 路径的其余部分全部捕获,包括尾部斜杠(顺便说一句 - 我不想要尾部斜杠)。

我有第一部分的代码:phpliveregex.com/p/pMO

有人可以帮助我如何使用第二部分的代码来扩展它吗?

非常感激!

标签: regexpcre

解决方案


我建议将此问题拆分为两个子问题。

我是说。

我们可以先preg_match用这个正则表达式吗

(brand|profile)\/(\d+)(.*)

在这里我们有

  • 在第一个捕获组中,全场比赛。
  • 在第二个捕获组中,您的标签(品牌或个人资料)
  • 在第三个捕获组中,我们有 ID(数字)
  • 并在第 4 个捕获组中的 URL 提醒

然后使用完整的 URL 提醒(第 4 个捕获组),我们可以preg_match_all使用这个正则表达式

[^\/]+

在这里,您拥有所有提醒路径。


推荐阅读