PHP获取URL最后部分
Published
2022-07-16
浏览次数 : 451
最简单的方式来获取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))。