【问题标题】:How to get the last path in a URL?如何获取 URL 中的最后一个路径?
【发布时间】:2010-02-16 13:47:38
【问题描述】:

我想获取 URL 中的最后一个路径段:

  • http://blabla/bla/wce/news.php
  • http://blabla/blablabla/dut2a/news.php

例如,在这两个网址中,我想获取路径段:'wce'和'dut2a'。

我尝试使用$_SERVER['REQUEST_URI'],但我得到了整个 URL 路径。

【问题讨论】:

    标签: php url-parsing


    【解决方案1】:

    试试:

    $url = 'http://blabla/blablabla/dut2a/news.php';
    $tokens = explode('/', $url);
    echo $tokens[sizeof($tokens)-2];
    

    假设 $tokens 至少有 2 个元素。

    【讨论】:

    • bahamut100,如果这是正确答案,那么您应该点击旁边的白色复选标记接受它。
    • @bahamut100,不客气。虽然我会去(并接受)亚历克斯的回答。
    • 它不会处理:http://foobar.com/path/path#fragment/fragment
    • @ddimitrov:是的,好点子。 OP 选择 Alex 解决方案的更多理由。无法删除我的答案,因为它是公认的答案...
    • 片段并不是真正的问题,因为它们不会转移到服务器。但是,这样的 url 将是一个问题:http://www.example.com/dir1/dir2/foo?redirect=http://anothersite.com/default.as‌​px
    【解决方案2】:

    试试这个:

    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']);
    

    我还使用来自 cmets 的一些 URL 对其进行了测试。我将不得不假设所有路径都以斜杠结尾,因为我无法确定 /bob 是目录还是文件。这将假定它是一个文件,除非它也有一个斜杠。

    echo getLastPathSegment('http://server.com/bla/wce/news.php'); // wce
    
    echo getLastPathSegment('http://server.com/bla/wce/'); // wce
    
    echo getLastPathSegment('http://server.com/bla/wce'); // bla
    

    【讨论】:

    • +1 用于使用 parse_url 获取 URL 路径。但是你也需要使用$_SERVER['REQUEST_URI'] 来做到这一点。
    • 我以为$_SERVER['REQUEST_URI'] 总是带着something/like/this 回来?
    • @alex:不,在 PHP 中它也包含查询。所以 URL 路径和 URL 查询(如在 HTTP 请求行中)。
    • @gumbo 感谢您的提示,我也为它制作了一个函数包装器。
    • 像这样:/bla/wce/news.php 它不会像 OP 想要的那样返回 news.php 而不是 wce 吗?它不应该返回倒数第二个元素而不是 end() 吗?我没有真正测试它,因为它需要 PHP 版本 >= 5.1.2 所以 cmiiw。
    【解决方案3】:

    很简单

    <?php
     echo basename(dirname($url)); // if your url/path includes a file
     echo basename($url); // if your url/path does not include a file
    ?>
    
    • basename 将返回路径的尾随名称组件
    • dirname 会返回父目录的路径

    http://php.net/manual/en/function.dirname.php

    http://php.net/manual/en/function.basename.php

    【讨论】:

    • 可能在此之前对 url 使用了一些过滤。在这样的事情上会失败http://www.example.com/dir1/dir2/foo?redirect=http://anothersite.com/default.aspx
    • 我只是使用 basename() 解决了它,以你的方式,我在“复古”中获得了第二级
    • basename($_SERVER['PHP_SELF']); 为我做的
    • @insign 这是 OP 的要求
    【解决方案4】:

    试试这个:

     $parts = explode('/', 'your_url_here');
     $last = end($parts);
    

    【讨论】:

    • 如果 URL 有斜杠,它可能会失败
    【解决方案5】:
    $arr =  explode("/", $uri);
    

    【讨论】:

    • 这只是解决方案的一半,仅代码的答案在 Stackoverflow 上的价值很低。
    • @mickmackusa 好吧,你迟到了 10 年。有用的反馈。
    • 我的志愿服务不会因时间而歧视。旧的低价值帖子被新访问者阅读并鼓励新的低价值帖子。我希望这个地方不断改进——不管内容有多老。请对这篇文章做一些事情
    【解决方案6】:

    另一种解决方案:

    $last_slash = strrpos('/', $url);
    $last = substr($url, $last_slash);
    

    1:获取最后一个斜线位置 2:获取最后一个斜杠和字符串结尾之间的子字符串

    看这里:TEST

    【讨论】:

      【解决方案7】:

      如果要处理绝对 URL,则可以使用 parse_url()(它不适用于相对 url)。

      $url = 'http://aplicaciones.org/wp-content/uploads/2011/09/skypevideo-500x361.jpg?arg=value#anchor';
      print_r(parse_url($url));
      $url_path = parse_url($url, PHP_URL_PATH);
      $parts = explode('/', $url_path);
      $last = end($parts);
      echo $last;
      

      此处的完整代码示例:http://codepad.org/klqk5o29

      【讨论】:

        【解决方案8】:

        我为自己编写了一个小函数来获取 url 的最后一个目录/文件夹。它仅适用于真实/现有的网址,而不适用于理论上的网址。就我而言,情况总是如此,所以...

        function uf_getLastDir($sUrl)
        {
            $sPath = parse_url($sUrl, PHP_URL_PATH);   // parse URL and return only path component 
            $aPath = explode('/', trim($sPath, '/'));  // remove surrounding "/" and return parts into array
            end($aPath);                               // last element of array
            if (is_dir($sPath))                        // if path points to dir
                return current($aPath);                // return last element of array
            if (is_file($sPath))                       // if path points to file
                return prev($aPath);                   // return second to last element of array
            return false;                              // or return false
        }
        

        为我工作!享受!并感谢以前的答案!!!

        【讨论】:

          【解决方案9】:

          这将保留最后一个斜线之后的部分。
          不用担心爆炸,例如没有斜线时。

          $url = 'http://blabla/blablabla/dut2a/news.php';
          $url = preg_replace('~.*/~', '', $url);
          

          会给

          news.php
          

          【讨论】:

            猜你喜欢
            • 2020-04-13
            • 2019-07-24
            • 1970-01-01
            • 1970-01-01
            • 2012-11-30
            • 2011-05-02
            • 2013-11-15
            • 1970-01-01
            • 2023-03-22
            相关资源
            最近更新 更多