PHP获取URL最后部分

Published
July 16, 2022
浏览次数 :  1

最简单的方式来获取URL最后部分,是用到函数basename()。

PHP官方basename函数的文档定义:

Returns trailing name component of path。(返回路径中的文件名部分)

比方说,

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

就会返回:9393903。

当然如果URL最后是一个查询的文本,会同时返回包含的值。在这种情况下公认的答案是最好的答案。

分离部分获取最后的元素:

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

为了支持符合apache支持规范风格的url,用rtrim函数更方便。

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

另一个更方便阅读的例子:

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

上面是之前的版本,最新的PHP版本的方法如下:

<?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"

上面解决问题的方式比较粗糙但展示了如何通过PCRE正则表达式模式将其封装在preg_match调用中,以实现更细粒度的控制。为了给这个裸机示例增加一些意义,应该将其包装在自己的函数中(这也会使别名变得多余)。只是为了简洁起见才这样介绍。

你可以使用preg_match来获取url中的任意部分。

在下面的这个例子中,样式十分简单,我们在查找一个正斜杠,(\/我们应该要escape它因为正斜杠表示正则表达式模式的开始和结束),以及一个或多个数字(\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+)$/。(.* 意思是0或者更多的字符。不是换行符。(newline character))。


Top