php 使用正则表达式从URI字符串中删除可能的尾随斜杠和/或查询字符串

hts6caw3  于 2023-05-05  发布在  PHP
关注(0)|答案(2)|浏览(110)

我有以下URI:

  • /controller/method/arg1/arg2
  • /controller/method/arg1/arg2/〈-尾部斜杠
  • /controller/method/arg1/arg2?param=1&param=2〈-尾随查询字符串

我需要一个正则表达式来提取/controller/method/arg1/arg2,同时记住它可以以/??+一些字符结束。
这一点:

^\/.*\??

对我不起作用,因为它在?之前使用字符。
理想情况下,我不需要尾随的/?,但如果模式留下了它们,我将在替换正则表达式后修剪它们。

tv6aics1

tv6aics11#

我相信人们可以想到更多更花哨的正则表达式,但就我所知,最简单的匹配正则表达式是;

^[^?]*

它在?关闭后剪切所有内容,其他匹配-正如您所说-很容易通过修剪处理。
要测试的ReFiddle

prdp8dxp

prdp8dxp2#

假设路径中没有空的目录名,可以使用重复的子模式来匹配一个可选的斜杠,后跟一个或多个非问号、非斜杠字符。在使用了这些允许的字符之后,使用\K来忘记完整的字符串匹配,然后匹配任何剩余的字符并将它们替换为空字符串。
代码:(Demo

$tests = [
    'controller/method/arg1/arg2',
    'controller/method/arg1/arg2/',
    'controller/method/arg1/arg2?param=1&param=2',
    'controller/method/arg1/arg2/?param=1&param=2',
    '/controller/method/arg1/arg2',
    '/controller/method/arg1/arg2/',
    '/controller/method/arg1/arg2?param=1&param=2',
    '/controller/method/arg1/arg2/?param=1&param=2',
];

var_export(
    preg_replace('#(?:/?[^?/]+)+\K.*#', '', $tests)
);

输出:

array (
  0 => 'controller/method/arg1/arg2',
  1 => 'controller/method/arg1/arg2',
  2 => 'controller/method/arg1/arg2',
  3 => 'controller/method/arg1/arg2',
  4 => '/controller/method/arg1/arg2',
  5 => '/controller/method/arg1/arg2',
  6 => '/controller/method/arg1/arg2',
  7 => '/controller/method/arg1/arg2',
)

相关问题