【问题标题】:Get Last Part of URL PHP获取 URL PHP 的最后一部分
【发布时间】:2011-11-15 17:45:58
【问题描述】:

我只是想知道如何使用 PHP 提取 URL 的最后一部分。

示例网址为:

http://domain.com/artist/song/music-videos/song-title/9393903

现在如何使用 PHP 提取最终部分?

9393903

URL中的变量个数总是一样的,id总是在最后。

【问题讨论】:

    标签: php url


    【解决方案1】:

    最简单的方法是使用basename()

    echo basename('http://domain.com/artist/song/music-videos/song-title/9393903');
    

    哪个会打印

    9393903

    当然,如果末尾有查询字符串,它会包含在返回值中,在这种情况下接受的答案是更好的解决方案。

    【讨论】:

    • 说真的。经过许多正则表达式后,我找到了这个答案。为什么我没有早点发现这个。简单明了。
    【解决方案2】:

    拆分出来,得到最后一个元素:

    $end = end(explode('/', $url));
    # or:
    $end = array_slice(explode('/', $url), -1)[0];
    

    编辑:为了支持 apache-style-canonical URL,rtrim 很方便:

    $end = end(explode('/', rtrim($url, '/')));
    # or:
    $end = array_slice(explode('/', rtrim($url, '/')), -1)[0];
    

    另一个我认为更易读的例子是 (Demo):

    $path = parse_url($url, PHP_URL_PATH);
    $pathFragments = explode('/', $path);
    $end = end($pathFragments);
    

    这个例子还考虑到只对 URL 的路径起作用。


    又一个编辑(多年后),包括规范化和简单的 UTF-8 替代使用(通过 PHP 中的 PCRE 正则表达式):

    <?php
    
    use function call_user_func as f;
    use UnexpectedValueException as e;
    
    $url = 'http://example.com/artist/song/music-videos/song-title/9393903';
    
    $result = preg_match('(([^/]*)/*$)', $url, $m)
    
        ? $m[1]
        : f(function() use ($url) {throw new e("pattern on '$url'");})
        ;
    
    var_dump($result); # string(7) "9393903"
    

    这很粗略,但展示了如何将其包装在 preg_match 调用中,以通过 PCRE 正则表达式模式进行更细粒度的控制。为了给这个裸机示例增加一些意义,它应该被包装在它自己的函数中(这也会使别名变得多余)。为简洁起见,仅以这种方式呈现。

    【讨论】:

    • 注意差距:这段代码利用了可能被认为是 PHP 中的错误的东西。我会更新答案。
    • @hakre +1,但如果$url 中有斜杠,您将一无所获。最好先使用array_filter 删除空元素——$pathFragments = array_filter(explode('/', $path));
    • @jibiel:或者rtrim-boogie,我编辑了答案,请看现在的第三个代码示例。
    • 如果我不得不猜测的话,这个解决方案的性能可能介于basename/str* 解决方案和preg 解决方案之间。虽然这是一种直观简单的方法,但它会带来一些运行时开销。
    • @hakre 演示链接已损坏。请修复它
    【解决方案3】:

    您可以使用preg_match 来匹配您想要的URL 部分。

    在这种情况下,由于模式很简单,我们正在寻找一个正斜杠(\/,我们必须转义它,因为正斜杠表示正则表达式模式的开始和结束),以及一个或多个数字 (\d+) 在字符串的最后 ($)。 \d+ 周围的括号用于捕获我们想要的部分:即结尾。然后我们将我们想要的结尾($end)分配给$matches[1](不是$matches[0],因为它与$url(即整个字符串)相同)。

    $url='http://domain.com/artist/song/music-videos/song-title/9393903';
    
    if(preg_match("/\/(\d+)$/",$url,$matches))
    {
      $end=$matches[1];
    }
    else
    {
      //Your URL didn't match.  This may or may not be a bad thing.
    }
    

    注意:您可能希望也可能不希望向此正则表达式添加一些更复杂的功能。例如,如果您知道您的 URL 字符串将始终http:// 开头,那么正则表达式可以变为 /^http:\/\/.*\/(\d+)$/(其中 .* 表示零个或多个字符(不是换行符) ))。

    【讨论】:

    • 不错。也可以在 1 行中使用 preg_replace 来完成。我会添加一个答案。
    • 这个解决方案可能是最慢的;不是讨厌,只是说。
    • example.com/123/my-slug/1235 你需要 1235 吗?
    • 它适用于字符串。但是您如何从 URL 中获取最后一部分?
    【解决方案4】:

    如果您正在寻找可以处理任何形式的URLs 的强大版本,这应该会很好:

    <?php
    
    $url = "http://foobar.com/foo/bar/1?baz=qux#fragment/foo";
    $lastSegment = basename(parse_url($url, PHP_URL_PATH));
    

    【讨论】:

    • 这是我最喜欢的。强大、高效且简洁。
    • 比其他的容易得多
    【解决方案5】:
    $id = strrchr($url,"/");
    $id = substr($id,1,strlen($id));
    

    这里是strrchr函数的描述:http://www.php.net/manual/en/function.strrchr.php

    希望有用!

    【讨论】:

    • 这个解决方案可能是最快的解决方案,如果适用,也许可以保存basename() 解决方案。
    • 这个解决方案很有帮助也很简单
    • 解决方案对我也很有帮助
    【解决方案6】:

    另一种选择:

    $urlarray=explode("/",$url);
    $end=$urlarray[count($urlarray)-1];
    

    【讨论】:

      【解决方案7】:

      这里是最优雅的解决方案之一Get characters after last / in url

      来自不满的山羊

      $id = substr($url, strrpos($url, '/') + 1);
      

      strrpos 获取斜线最后出现的位置;子串 返回该位置之后的所有内容。

      【讨论】:

        【解决方案8】:

        一个班轮:$page_path = end(explode('/', trim($_SERVER['REQUEST_URI'], '/')));

        获取 URI,修剪斜线,转换为数组,抓取最后一部分

        【讨论】:

        【解决方案9】:

        故障安全解决方案是:

        引用自https://stackoverflow.com/a/2273328/2062851

        function getLastPathSegment($url) {
            $path = parse_url($url, PHP_URL_PATH); // to get the path from a whole URL
            $pathTrimmed = trim($path, '/'); // normalise with no leading or trailing slash
            $pathTokens = explode('/', $pathTrimmed); // get segments delimited by a slash
        
            if (substr($path, -1) !== '/') {
                array_pop($pathTokens);
            }
            return end($pathTokens); // get the last segment
        }
        
        echo getLastPathSegment($_SERVER['REQUEST_URI']); //9393903
        

        【讨论】:

          【解决方案10】:

          这将轻松完成所需 URL 的最后一部分

          $url="http://domain.com/artist/song/music-videos/song-title/9393903";
          $requred_string= substr(strrchr($url, "/"), 1);
          

          这将在右侧第一个“/”之后为您提供字符串。

          【讨论】:

          • 请注意:如果末尾有斜线,这将失败。请参阅 hakre 及其编辑的解决方案中的 cmets。查看 Peter 的解决方案:basename() 函数就是为此而生的。
          【解决方案11】:
          $mylink = $_SERVER['PHP_SELF'];
          $link_array = explode('/',$mylink);
          echo $lastpart = end($link_array);
          

          【讨论】:

            【解决方案12】:
            function getLastPathSegment($url) {
                $arr = explode('/', $url);
                return $arr[count($arr) - 1];
            }
            

            【讨论】:

            • 虽然此代码可以回答问题,但提供有关 如何 和/或 为什么 解决问题的附加上下文将改善答案的长期价值。
            【解决方案13】:

            1-liner

            $end = preg_replace( '%^(.+)/%', '', $url );
            
            // if( ! $end ) no match.
            

            这只是删除最后一个斜杠之前的所有内容,包括它。

            【讨论】:

              【解决方案14】:

              一条线的工作答案:

              $url = "http://www.yoursite/one/two/three/drink";
              echo $end = end((explode('/', $url)));
              

              输出:

              【讨论】:

              • 我只能从 url 得到两个/三个/drink 吗?
              猜你喜欢
              • 2013-11-01
              • 1970-01-01
              • 2013-06-14
              • 2019-04-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多