【问题标题】:How get last segment of url using PCRE?如何使用 PCRE 获取最后一段 url?
【发布时间】:2012-01-19 13:41:32
【问题描述】:

我有一个 url,-“http://example.com/sales/view/id/705”,我需要获取最后一段 (705)。

如何使用 PCRE 做到这一点?

【问题讨论】:

  • 使用 PCRE 是我问题中的主要词汇。
  • $pattern = '~http://example.com/sales/view/id/([0-9]+)~'; 您能否详细介绍一下为什么需要 pcre 解决方案?我不是质疑它的必要性。但您的回答可能会显着改变解决方案。
  • 我需要为此特殊链接添加 utm 链接(分析),我正在使用 preg_match,规则很少。
  • 到目前为止发布的每个人都认为忽略http://example.com/sales/view/id/705?foohttp://example.com/sales/view/id/705?foo/barhttp://example.com/sales/view/id/705#foohttp://example.com/sales/view/id/705#foo/bar 是安全的。 (只有使用 URI 的解决方案适用于这些。)真的是这样吗?

标签: php pcre


【解决方案1】:

这应该在 Perl 中完成:

my ($last) = $url =~ /([^\/]+)\z/;

但我宁愿使用URI 模块:

my $last = (URI->new($url)->path_segments)[-1];

【讨论】:

  • 如果 URL 有查询或片段,您的正则表达式可能会失败,这说明了为什么使用 URI 是明智的选择。 +1 提及模块。
【解决方案2】:

(在 PHP 中)我不会将 PCRE 用于如此琐碎且明确的工作。我会这样做:

$parts = explode('/', rtrim($url, '/'));
$partYouWant = array_pop($parts);

编辑

如果您需要使用 PCRE(尽管我不知道您为什么会这样做),eugene y 的答案的这种变体就可以了:

$pattern = '#/([^/]+)\z#';
$url = 'http://example.com/sales/view/id/705';
preg_match($pattern, $url, $matches);
echo $matches[1];

【讨论】:

    【解决方案3】:

    在 PHP 中,您可以在一行代码中做到这一点:

    $url = 'http://example.com/sales/view/id/705';
    substr($url, strrpos($url, '/') + 1);
    

    【讨论】:

    • +1 - 我怀疑这会比我的解决方案成本更低,并且会以相同的方式工作。这也可能需要rtrim($url, '/');,尽管我只是将它放在一个安全防护中,以防止 URL 可能带有斜杠,但情况可能并非如此。
    • @DaveRandom 我认为这也更快。正如您所指出的,它可能不适用于字符串末尾的“/”,但似乎并非如此。无论如何,由于-1,似乎有人不喜欢我的解决方案:)
    • 我也有一个 - 但你能做什么。至少它会让反对者代表反对而不是解释。如果您投了第一个反对票并且不对帖子发表评论,我认为您应该输-5。
    【解决方案4】:

    非 PCRE 替代方案:

    $url="http://example.com/sales/view/id/705";
    $lastPart = current(array_reverse((explode('/',parse_url($url,PHP_URL_PATH)))));
    

    怀疑它是否更快

    【讨论】:

      【解决方案5】:

      您可以对从最后一个/ 到结束的所有内容使用此模式([^\/]*)$

      也许也很有趣:([^\/\?]*)(\?.*)?$ 为您提供最后一个 / 和第一个 ? 之间的所有内容

      【讨论】:

        【解决方案6】:

        如果可以的话,对 PCRE 说不,:-)。

        echo basename('http://example.com/sales/view/id/705');
        

        【讨论】:

          【解决方案7】:
          preg_match('@/([1-9]\d*)/?(?:$|\?)@', $url, $matches);//$matches[1] contains your id
          

          【讨论】:

            【解决方案8】:

            最简单的:

              $ok=preg_match('#\d+$#',$url,$m);
              if($ok)
                echo $m[0],"\n";
            

            聪明:

              $ok=preg_match('#/(\d+)$#',$url,$m);
              if($ok)
                echo $m[1],"\n";
            

            灵活:(因为它还允许使用数字以外的单词)

              $ok=preg_match('#/(\w+)$#',$url,$m);
              if($ok)
                echo $m[1],"\n";
            

            更灵活:(因为它现在允许所有非 / 匹配)

              $ok=preg_match('#/(.*?)$#',$url,$m);
              if($ok)
                echo $m[1],"\n";
            

            【讨论】:

              猜你喜欢
              • 2017-12-29
              • 1970-01-01
              • 2020-04-13
              • 2021-01-14
              • 2012-02-06
              • 1970-01-01
              • 2012-11-30
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多