模式匹配后,结果数组的URL路径剩余部分

时间:2018-11-01 12:01:27

标签: regex pcre

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

我希望我的正则表达式执行以下两项操作:

  1. 在“品牌”或“配置文件”的模式匹配之后立即找到下一个URL路径部分的ID
  2. 将ID之后的URL路径部分的其余部分拆分为matchs数组中的单独项目,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

上提供了第一部分的代码

有人可以帮我扩展第二部分的代码吗?

非常感谢!

1 个答案:

答案 0 :(得分:0)

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

我是说。

我们可以使用此正则表达式做第一个preg_match

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

这里有

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

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

[^\/]+

这里有所有提醒路径。